您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 停车场问题(打印稿)C++
实验二停车场管理问题描述:设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场,每辆停放在停车场的车离开停车场时必须按它停留时间长短交纳费用。试为停车场编制按此要求进行管理的模拟程序。基本要求:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。测试数据:设n=2,输入数据为(’A’,1,5),(’A’,2,10),(’D’,1,15),(’A’,3,20),(’A’,4,25),(’A’,5,30),(’D’,2,35),(’D’,4,40),(’E’,0,0)。其中:’A’表示到达(Arrival);’D’表示离去(Departure);’E’表示输入结束(End)。实现提示:需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。下面是以VC代码写成的,但没有用到栈和队列的中所声明的类。要求:使用栈和队列的中所声明的类改编,并保证运行正确。#includeiostream.hstructnode1{intcno;//车号intctime;//到达停车场的时间};typedefstruct{node1*base;node1*top;intsize;}stack1,stack2;//分别均用顺序存储表示停车场栈和临时停放栈structnode2{intcno;//车号intctime;//到达时间node2*next;};typedefstruct{node2*front;//队头指针node2*rear;//队尾指针}que;//用链表表示队列--便道voidinitial1(stack1&s,intn)//初始化停车场栈{s.base=newnode1[n*sizeof(node1)];if(!s.base){coutstack1false!;return;}s.top=s.base;s.size=n;}voidinitial2(que&q){//初始化等待队列--便道q.front=q.rear=newnode2;if(!q.front){coutqueuefalse!;return;}q.front-next=NULL;}voidinitial3(stack2&s,intn)////初始化临时停放栈{s.base=s.top=newnode1[(n-1)*sizeof(node1)];if(!s.base){coutstack2false!;return;}}voidINstack1(stack1&s,intcnum,intctim)//入停车场栈{s.top-cno=cnum;s.top-ctime=ctim;s.top++;}voidINque(que&q,intcnum,intctim)//入等待队列--便道{node2*p;p=newnode2;p-cno=cnum;p-ctime=ctim;p-next=NULL;q.rear-next=p;q.rear=p;}voidINstack2(stack1&s1,stack2&s2,intk)//将停车场s1中k之上的车倒入临时停放栈s2{node1*p;p=s1.base;while(p-cno!=k)//查找车号为k的车所在位置,由p指向p++;while(s1.top-1!=p){//将停车场s1中k之上的车倒入临时停放栈s2s2.top-cno=s1.top-cno;s2.top-ctime=s1.top-ctime;s2.top++;s1.top--;}}voidmain(void){stack1s1;//停车场栈stack2s2;//临时停放栈queq;//等待队列--便道intprice,time,n,num,m;charstate;cout输入价格:;cinprice;cout输入停车场容量:;cinn;initial1(s1,n);//s1模拟停车场栈initial2(q);//q模拟等待队列--便道initial3(s2,n);//s2模拟临时停放栈inttag=1;while(tag){if(tag==0)break;cout输入“A”表示到达,“D”表示离开,“E”表示结束输入:;cinstate;cout输入车号:;cinnum;cout输入到达或离开的时刻:;cintime;switch(state){case'E':tag=0;break;case'A':if(s1.top-s1.bases1.size)//直接入停车场栈{INstack1(s1,num,time);m=int(s1.top-s1.base);cout此车在停车场的位置是:mendl;}else//进入等待队列--便道{INque(q,num,time);//加入等待队列尾node2*p=q.front-next;//因等待队列有头结点m=1;while(p!=q.rear){p=p-next;m++;}//计算位置cout此车在便道上的位置是:mendl;};break;case'D':INstack2(s1,s2,num);//将停车场中num之上的车倒入临时停放栈s2cout停留时间为:time-s1.top-ctime+1endl;cout费用是:price*(time-s1.top-ctime+1)'\n';s1.top--;//临时停放栈s2非空时,将s2中的车回到停车场while(s2.top!=s2.base){s1.top-cno=s2.top-cno;s1.top-ctime=s2.top-ctime;s1.top++;s2.top--;}//有一辆车离开,只要等待队列--便道非空,则必可把等待队列头的车加入停车场栈if(q.front!=q.rear){node2*p1;p1=q.front-next;s1.top-cno=p1-cno;s1.top-ctime=time;//由队列中取出的车进入停车场的时间按当前计算q.front-next=p1-next;s1.top++;}break;default:cout输入错误!;tag=0;break;}}}
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:停车场问题(打印稿)C++
链接地址:https://www.777doc.com/doc-7165562 .html