设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。
在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。
若车场内已停满n辆车,则后来的汽车要在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进去的车辆必须先推出车场为它让路,待该辆车开出大门以后,其他车辆再按原次序返回车场。
每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。
试编写程序,模拟上述管理过程。
要求以顺序栈模拟停车场,以链队列模拟便道。
从终端读入汽车到达或离去的数据,每组数据包括三项:(1)是“到达”还是“离去”(2)汽车牌照号码;(3)“到达”或“离去”的时刻。
与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应缴的费用。
(需另设一个栈,临时停放为让路而从车场退出的车。
)#include<iostream>#define M 5using namespace std;typedef int Datatype;typedef struct{Datatype bianhao[M];int top;int h[M]; //时int m[M]; //分int s[M]; //秒}Seqstack; //停车场栈的定义typedef struct Node //便道结点,表示一辆汽车{Datatype bianhao;struct Node *next;}node;typedef struct{node *front;node *rear;int count;}biandao; //便道//停车场顺序栈初始化void InitSeqstack(Seqstack *t){t->top=-1;}//进栈,即进入停车场int Push(Seqstack *t,int x,int h,int m,int s){if(t->top==M-1)return 0; //停车场栈已满t->top++;t->bianhao[t->top]=x;t->h[t->top]=h;t->m[t->top]=m;t->s[t->top]=s;return 1;}//出栈,即离开停车场int Pop(Seqstack *t,int *x,int *h,int *m,int *s){if(t->top==-1)return 0;else{*x=t->bianhao[t->top];*h=t->h[t->top];*m=t->m[t->top];*s=t->s[t->top];t->top--;return 1;}}//查找某牌照的车在停车场中的位置,若找到则返回其位置,否则返回-1int Find(Seqstack t,int x){int i;for(i=0;i<=t.top;i++){ if(t.bianhao[i]!=x)continue;elsebreak;}if(i>t.top)return(-1);elsereturn(i);}//判断停车场内是否已满int IsSeqstackFull(Seqstack t){if(t.top==M-1)return 1;elsereturn 0;}//判断停车场内是否已没有车辆int IsSeqstackEmpty(Seqstack t){if(t.top==-1)return 1;elsereturn 0;}//依次显示停车场内停放的所有车辆void ShowSeqstack(Seqstack t){int i;if(t.top==-1)cout<<"停车场内没有停放车辆"<<endl;elsefor(i=0;i<=t.top;i++)cout<<"牌照:"<<t.bianhao[i]<<endl;}//队列初始化int Initbiandao(biandao *Q){Q->front=new node;if(Q->front!=NULL){Q->rear=Q->front;Q->front->next=NULL;Q->count=0;return(true);}else return(false);}//入队操作,即当停车场满了的时候,再到达的车辆进去便道队列int Enterbiandao(biandao *Q,int x){node *NewNode;NewNode=new node;if(NewNode!=NULL){NewNode->bianhao=x;NewNode->next=NULL;Q->rear->next=NewNode;Q->rear=NewNode;Q->count++;return(true);}else return(false);}//出队操作,即便道上的车辆从便道开出来int Deletebiandao(biandao *Q,int *x){node *p;if(Q->front==Q->rear)return(false);p=Q->front->next;Q->front->next=p->next;if(Q->rear==p)Q->rear=Q->front;*x=p->bianhao;free(p);Q->count--;return(true);}//判断便道队列是否为空int IsbiandaoEmpty(biandao Q){if(Q.front==Q.rear)return(true);elsereturn(false);//当count=0时,就空了}//依次显示便道上停放的所有车辆void Showbiandao(biandao Q){node *p;p=Q.front->next;if(p==NULL)cout<<"便道上没有停放车辆!"<<endl;elsewhile(p!=NULL){cout<<"牌照:"<<p->bianhao<<endl;p=p->next;}}36//计算停留时间差double Time(int h1,int m1,int s1,int h2,int m2,int s2) {double p,q;p=h1*3600+m1*60+s1-(h2*3600+m2*60+s2);q=(double)p/3600;return(q);}//计算停车费用double Cost(double t,int u){return(t*u);}//主函数void main(){double time,cost;int ch;int x,*y,z;int i,flag=1,h,m,s,unit_price,hh,mm,ss;y=new int;Seqstack *t; //定义停车栈t=new Seqstack;InitSeqstack(t);biandao *Q; //定义便道队列Q=new biandao;Initbiandao(Q);Seqstack *r; //定义让路栈r=new Seqstack;InitSeqstack(r);cout<<"请设置停车费用单价:(__元/小时)"<<endl;cin>>unit_price;while(flag){cout<<"***************************"<<endl;cout<<"请选择命令:"<<endl<<"1:到达"<<endl<<"2:离开"<<endl<<"3:依次显示停车场内停放车辆"<<endl<<"4:依次显示便道上停放车辆"<<endl<<"5:结束"<<endl;cout<<"***************************"<<endl;cin>>ch;switch(ch){case 1:cout<<"请输入到达的汽车牌照号码:"<<endl;cin>>x;if(IsSeqstackFull(*t)){cout<<"停车场已满,请在便道等候!"<<endl;Enterbiandao(Q,x);cout<<"将此车停放在便道的"<<Q->count<<"号位置!"<<endl;}else{while(1){cout<<"请输入到达的时间(例如,21 08 23):"<<endl;cin>>h>>m>>s;if (h<0 || h>23) continue; // 输入数据不合法,回去重新输入if (m<0 || m>59) continue;if (s>-1 && s<61)break; // 输入时间全部合法,退出循环}Push(t,x,h,m,s);cout<<"将此车停放在停车场的"<<t->top+1<<"号停车位置"<<endl;}break;case 2:if(IsSeqstackEmpty(*t))cout<<"停车场内已没有车辆"<<endl;else{cout<<"请输入要离开的汽车的车牌照号码:"<<endl;cin>>x;if(Find(*t,x)==-1)cout<<"停车场内没有该汽车!"<<endl;else//有该号码的汽车{while(1){cout<<"请输入离开的时间(例如,23 58 03):"<<endl;cin>>h>>m>>s;if (h<0 || h>23) continue; // 输入数据不合法,回去重新输入if (m<0 || m>59) continue;if (s>-1 && s<61)break; // 输入时间全部合法,退出循环}if(Find(*t,x)==t->top){Pop(t,y,&hh,&mm,&ss);//要离开的车辆正好是最后一辆进入停车场的车time=Time(h,m,s,hh,mm,ss);cout<<"停留时间为:"<<time<<"小时"<<endl; //结账cost=Cost(time,unit_price);cout<<"应缴费用为:"<<cost<<"元"<<endl;}else{for(i=(Find(*t,x)+1);i<=t->top;)//该车不是最后一辆进入停车场的车,其它车要让路{Pop(t,y,&hh,&mm,&ss);Push(r,*y,hh,mm,ss); //进入让路栈r}Pop(t,y,&hh,&mm,&ss);//要离开的车辆离开了time=Time(h,m,s,hh,mm,ss);cout<<"停留时间为:"<<time<<"小时"<<endl; //结账cost=Cost(time,unit_price);cout<<"应缴费用为:"<<cost<<"元"<<endl;for(i=0;i<=r->top;) //让路的车辆重新回到停车场{Pop(r,y,&hh,&mm,&ss);Push(t,*y,hh,mm,ss);}}if(!IsbiandaoEmpty(*Q)){Deletebiandao(Q,&z); //便道上的第一辆车出队Push(t,z,h,m,s); //进入停车场,默认进入的时刻就是刚才的车离开的时刻}elsecout<<"便道上没有车辆等候!"<<endl;}}break;case 3:ShowSeqstack(*t);break;case 4:Showbiandao(*Q);break;case 5:flag=0;break;default:cout<<"错误命令!"<<endl;}}}。