试题描述:
设停车场只有一个可停放几辆汽车的狭长通道,只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车辆开走,则排在便道上的第一辆汽车即可进入;当停车场内某辆汽车要开走时,由于停车场是狭长的通道,在它之后开入的车辆必须先推出车场为他让路,待车辆开出大门,为他让路的车辆再按原次序进入车场。试设计这样一个停车场模拟管理程序,要求有运行结果截图。
要求:
(1)车辆进入要有登记;并自动给车辆编号;记录车辆停靠状态。
定义结构体,并且车位MAX==5;
typedef struct NODE
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar;//用栈定义,构造停车场
typedef struct car
{
CarNode*data;
struct car*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedef struct Node
{
QueueNode *head,*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道
(2)当停车场的停车位上都已停满了汽车,又有新的汽车到来时要把它调度到便道上,便道上的车辆要按照进入便道的前后顺序顺次序放在便道上,为便道上的每个位置分配一个固定的编号。当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位上的某个车位。
typedef struct NODE
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar;//用栈定义,构造停车场
typedef struct car
{
CarNode*data;
struct car*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedef struct Node
{
QueueNode *head,*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道
代码如下:(此代码有修改,不能直接运行,修改错误即可)
#include<iostream>
#include<string>
using namespace std;
#define MAX 5
#define print 0.05
typedef struct time
{
int hour,min;
}Time;
typedef struct node
{
string num;
Time reach,leave;
}CarNode;//结构体:定义每辆车的牌号,车辆状态我定义为:进入时刻与离开时刻
typedef struct NODE
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar;//用栈定义,构造停车场
typedef struct car
{
CarNode*data;
struct car*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedef struct Node
{
QueueNode *head,*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道
void InitStack(SeqStackCar*);
int InitQueue(LinkQueueCar*);
int Reach(SeqStackCar*,LinkQueueCar*);
void Leave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);
void List(SeqStackCar,LinkQueueCar);
void PRINT(CarNode*p,int room);
int main()
{
SeqStackCar Enter,Temp;//初始栈,中转栈
LinkQueueCar Wait;//便道队列
int a;
InitStack(&Enter);
InitStack(&Temp);
InitQueue(&Wait);//初始化
while(1)
{
cout<<" 欢迎光临停车场! "<<endl;
cout<<" 1.车辆到达登记"<<endl;
cout<<" 2.车辆离开登记"<<endl;
cout<<" 3.车辆停靠查询"<<endl;
cout<<" 4.退出系统"<<endl;//系统设置
while(1)
{
cin>>a;
if(a>=1&&a<=4)break;
else cout<<endl<<"请选择:1~4";
}
switch(a)
{
case 1:Reach(&Enter,&Wait);break;
case 2:Leave(&Enter,&Temp,&Wait);break;
case 3:List(Enter,Wait);break;
case 4:exit(0);
default:break;
}
}
}
void InitStack(SeqStackCar*s)//堆栈初始化
{
s->top=0;
s->stack[s->top]=NULL;
}
int InitQueue(LinkQueueCar*Q)//队列初始化
{
Q->head=new QueueNode;
if(Q->head!=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return 1;
}
else return -1;
}
void PRINT(CarNode*p,int room)//输出离开停车场的车辆情况
{
int A,B,C,D,price;
cout<<"\n车辆离开的时间:"<<endl;
cout<<"输入小时:";
cin>>p->leave.hour;
cout<<"输入分钟:";
cin>>p->leave.min;
cout<<"离开车辆的车牌号为:";
cout<<p->num;
cout<<endl<<"其到达时间为:"<<p->reach.hour<<":"<<p->reach.min;
cout<<"离开时间为:"<<p->leave.hour<<":"<<p->leave.min;
A=p->reach.hour;
B=p->reach.min;
C=p->leave.hour;
D=p->leave.min;
cout<<endl<<"应交费用为:"<<((C-A)*60+(D-B))*price<<"元"<<endl;
cout<<"车辆离开登记完毕!"<<endl;
cout<<"------------------------------------------------------"<<endl;
delete p;
}
int Reach(SeqStackCar*Enter,LinkQueueCar*W)
{
CarNode*p;
QueueNode*t;
p=new CarNode;
cout<<"-------------------------------------------------------"<<endl;
cout<<"车辆到达登记开始:"<<endl;
cout<<endl<<"请输入车牌号:";
cin>>p->num;
if(Enter->top<MAX)//如果车位未满则进入停车场
{
Enter->top++;
cout<<endl<<"车辆在车场第"<<Enter->top<<"位置.";
cout<<endl<<"车辆到达时间:"<<endl;
cout<<"输入小时:";
cin>>p->reach.hour;
cout<<"输入分钟:";
cin>>p->reach.min;
cout<<endl<<"车辆到达登记完毕!"<<endl;
cout<<"---------------------------------------------------"<<endl;
Enter->stack[Enter->top]=p;
return 1;
}
else//如果车位已满,则停在便道上
{
cout<<"----------------------------------------------------"<<endl;
cout<<endl<<"该车须停靠在便道上,有车位时进入停车场"<<endl;
t=new QueueNode;
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return 1;
}
}
void Leave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
{
int room;
CarNode *p,*t;
QueueNode *q;
if(Enter->top>0)
{
while(1)
{
cout<<"----------------------------------------------"<<endl;
cout<<"车辆离开登记开始:"<<endl;
cout<<endl<<"请输入车在车场的位置/1--"<<Enter->top<<"/:";
cin>>room;
if(room>=1&&room<=Enter->top)
break;
}
while(Enter->top>room)//从停车场堆栈向中转堆栈移动车辆,直到要离开车辆的位置停止
{
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)//将中转堆栈中的车辆移到停车场堆栈
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
cout<<"-----------------------------------------------------"<<endl;
cout<<"车辆离开登记结算:"<<endl;
PRINT(p,room);
if((W->head!=W->rear)&&Enter->top<MAX)
{
q=W->head->next;
t=q->data;
Enter->top++;
cout<<endl<<"便道的"<<t->num<<"号车进入车场第"<<Enter->top<<"位置."<<endl;
cout<<"请输入"<<t->num<<"号车进入车场时间:"<<endl;
cout<<"输入小时:";
cin>>t->reach.hour;
cout<<"输入分钟:";
cin>>t->reach.min;
W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
Enter->stack[Enter->top]=t;
delete q;
}
else cout<<endl<<"便道里没有车!"<<endl;
}
else cout<<endl<<"车场里没有车"<<endl;
}
void List1(SeqStackCar*S)//查看停车场内车辆情况的函数定义
{
int i;
if(S->top>0)
{
cout<<"-----------------------------------------------------"<<endl;
cout<<endl<<"车场内部车辆停靠情况:"<<endl;
cout<<endl<<"位置 到达时间 车牌号"<<endl;
for(i=1;i<=S->top;i++)
{
cout<<i;
cout<<" "<<S->stack[i]->reach.hour<<":"<<S->stack[i]->reach.min;
cout<<" "<<S->stack[i]->num<<endl;
}
}
else cout<<endl<<"车场里没有车"<<endl;
cout<<"--------------------------------------------------------"<<endl;
}
void List2(LinkQueueCar*W)//查看便道上停靠车辆情况的函数定义
{
QueueNode *p;
p=W->head->next;
if(W->head!=W->rear)
{
cout<<"---------------------------------------------------"<<endl;
cout<<endl<<"便道停靠车辆情况:"<<endl;
while(p!=NULL)
{
cout<<endl<<"车辆牌号:";
cout<<p->data->num<<endl;
p=p->next;
}
}
else cout<<endl<<"便道里没有车。"<<endl;
cout<<"--------------------------------------------------------"<<endl;
}
void List(SeqStackCar S,LinkQueueCar W)//车辆列表显示函数
{
int flag,tag;
flag=0;
while(flag)
{
cout<<"----------------------------------------------------"<<endl;
cout<<"车辆停靠查询开始:"<<endl;
cout<<endl<<"请选择 1|2|3: "<<endl;
cout<<"1.车场列表"<<endl<<"2.便道列表"<<endl<<"3.返回主菜单"<<endl;
while(1)
{
cin>>tag;
if(tag>=1||tag<=3)break;
else cout<<endl;
cout<<"请选择 1~3:";
}
switch(tag)
{
case 1:List1(&S);
cout<<"车辆停靠查询结束!"<<endl;break;
case 2:List2(&W);
cout<<"车辆停靠查询结束!"<<endl;break;
case 3:flag=0;break;
default:break;
}
}
cout<<"-----------------------------------------------------"<<endl;
}
编译效果: