哈尔滨华德学院,11级计算机系吴林原创问题描述:设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停留的时间。程序提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。#includeiostream#includestringusingnamespacestd;//#includeprocess.h#defineMAX5//停车场车位数#defineprint0.05//每分钟收取的费用typedefstructtime{inthour,min;}Time;//定义时间结点typedefstructnode{stringnum;Timereach,leave;}CarNode;//定义每辆车的牌号,进入时刻,离开时刻typedefstructNODE{CarNode*stack[MAX+1];inttop;}SeqStackCar;//用栈定义,构造停车场typedefstructcar{CarNode*data;structcar*next;}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆typedefstructNode{QueueNode*head,*rear;}LinkQueueCar;//用队列定义,构造停车场外的等候便道voidInitStack(SeqStackCar*);//初始化堆栈函数声明intInitQueue(LinkQueueCar*);//初始化队列头结点函数声明intReach(SeqStackCar*,LinkQueueCar*);//车辆进入时登记函数声明voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开时函数声明voidList(SeqStackCar,LinkQueueCar);//查看停车场内车辆情况及便道上车辆情况的函数声明voidPRINT(CarNode*p,introom);//输出离开停车场的车辆情况voidmain(){SeqStackCarEnter,Temp;//初始栈,中转栈LinkQueueCarWait;//便道队列inta;InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);//初始化while(1){cout欢迎光临停车场!endl;cout1.车辆到达登记endl;cout2.车辆离开登记endl;cout3.车辆停靠查询endl;cout4.退出系统endl;//系统选项设置while(1){cina;if(a=1&&a=4)break;elsecoutendl请选择:1~4;}switch(a){case1:Reach(&Enter,&Wait);break;//调用进入停车场函数case2:Leave(&Enter,&Temp,&Wait);break;//调用离开停车场函数case3:List(Enter,Wait);break;//调用查看函数case4:exit(0);default:break;}//system(cls);}}voidInitStack(SeqStackCar*s)//堆栈初始化{s-top=0;s-stack[s-top]=NULL;}intInitQueue(LinkQueueCar*Q)//队列初始化{Q-head=newQueueNode;if(Q-head!=NULL){Q-head-next=NULL;Q-rear=Q-head;return1;}elsereturn-1;}voidPRINT(CarNode*p,introom)//输出离开停车场的车辆情况{intA,B,C,D;cout\n车辆离开的时间:endl;cout输入小时:;cinp-leave.hour;cout输入分钟:;cinp-leave.min;cout离开车辆的车牌号为:;coutp-num;coutendl其到达时间为: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;coutendl应交费用为:((C-A)*60+(D-B))元endl;cout车辆离开登记完毕!endl;cout------------------------------------------------------endl;deletep;}intReach(SeqStackCar*Enter,LinkQueueCar*W){CarNode*p;QueueNode*t;p=newCarNode;cout-------------------------------------------------------endl;cout车辆到达登记开始:endl;coutendl请输入车牌号:;cinp-num;if(Enter-topMAX)//如果车位未满则进入停车场{Enter-top++;coutendl车辆在车场第Enter-top位置.;coutendl车辆到达时间:endl;cout输入小时:;cinp-reach.hour;cout输入分钟:;cinp-reach.min;coutendl车辆到达登记完毕!endl;cout---------------------------------------------------endl;Enter-stack[Enter-top]=p;return1;}else//如果车位已满,则停在便道上{cout----------------------------------------------------endl;coutendl该车须停靠在便道上,有车位时进入停车场endl;t=newQueueNode;t-data=p;t-next=NULL;W-rear-next=t;W-rear=t;return1;}}voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){introom;CarNode*p,*t;QueueNode*q;if(Enter-top0){while(1){cout----------------------------------------------endl;cout车辆离开登记开始:endl;coutendl请输入车在车场的位置/1--Enter-top/:;cinroom;if(room=1&&room=Enter-top)break;}while(Enter-toproom)//从停车场堆栈向中转堆栈移动车辆,直到要离开车辆的位置停止{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-topMAX){q=W-head-next;t=q-data;Enter-top++;coutendl便道的t-num号车进入车场第Enter-top位置.endl;cout请输入t-num号车进入车场时间:endl;cout输入小时:;cint-reach.hour;cout输入分钟:;cint-reach.min;W-head-next=q-next;if(q==W-rear)W-rear=W-head;Enter-stack[Enter-top]=t;deleteq;}elsecoutendl便道里没有车!endl;}elsecoutendl车场里没有车endl;}voidList1(SeqStackCar*S)//查看停车场内车辆情况的函数定义{inti;if(S-top0){cout-----------------------------------------------------endl;coutendl车场内部车辆停靠情况:endl;coutendl位置到达时间车牌号endl;for(i=1;i=S-top;i++){couti;coutS-stack[i]-reach.hour:S-stack[i]-reach.min;coutS-stack[i]-numendl;}}elsecoutendl车场里没有车endl;cout--------------------------------------------------------endl;}voidList2(LinkQueueCar*W)//查看便道上停靠车辆情况的函数定义{QueueNode*p;p=W-head-next;if(W-head!=W-rear){cout---------------------------------------------------endl;coutendl便道停靠车辆情况:endl;while(p!=NULL){coutendl车辆牌号:;coutp-data-numendl;p=p-next;}}elsecoutendl便道里没有车。endl;cout-----------------------------