停车场问题---含-完整C程序代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

停车场问题完整C程序代码1)内容:设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的在最北端),若停车场内已经停满n辆车,那么后来的车只能在场外等候,一旦有车开走,则等候在第一位的车即可开入(这是一个队列设长度为m);当停车场内某辆车需要开出,则在它之后的车辆必须给它让道,当这辆车驶出停车场后,其他车辆按序入栈。每辆车按时间收费。2)要求:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。每一组输入数据包括三个数据:汽车的“到达”(’A’表示)或“离去”(’D’表示)信息,汽车标识(牌照号)以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。栈以顺序结构实现,队列以链表结构实现。#includestdio.h#includestdlib.h#definepmax3//定义停车场的最大容车量为3#defineprice2//停车单价为2staticintflag=0;//全局变量,用来记录停车场车的数量structparkcar//定义车辆的结构体{longnum;inttime;structparkcar*next;}*head,*rear;structparkcarpc[pmax];//创建停车场的结构体数组structparkcartc[pmax];//创建用来缓存停车场出来的车辆的结构体数组structparkcar*inqueue(longcarnum,intatime);//声明入队列函数,让车辆进入候车区voidarrive(void);//声明到达函数voidleave(void);//声明离开函数voiddisplay_P(void);//声明显示停车场车辆信息的函数voiddisplay_W(void);//声明显示侯车区车辆信息的函数intmain(){head=NULL;//初始化队列头指针和尾指针rear=NULL;intstate=0;printf(\t======ParkcarMenu======\n);//输出停车菜单printf(\tprice:2\n);printf(\tinputstate\n);//通过先输入状态(如A),后执行相应函数printf(\tAarrive\n);printf(\tDleave\n);printf(\tPdisplaypark_car\n);printf(\tWdisplaywait_car\n);printf(\tEquit\n);do{printf(input:\n);scanf(%c,&state);fflush(stdin);switch(state)//通过先输入状态(如A),后执行相应函数{case'A':arrive();break;case'D':if(pc[flag-1].num==NULL)//如果停车场为空则输出为空printf(Parkisempty!\n);elseleave();break;case'P':display_P();break;case'W':display_W();break;case'E':break;default:printf(errormessage,inputagain!\n);}}while(state!='E');//当输入E则退出return0;}voidarrive(void){longcarnum;intatime;printf(pleaseinputcarnumberandarrivetime!\n);scanf(%ld%d,&carnum,&atime);fflush(stdin);if(flag!=pmax)//如果停车场未满,则入停车场{pc[flag].num=carnum;pc[flag].time=atime;++flag;}else{inqueue(carnum,atime);//否则进候车区}}structparkcar*inqueue(longcarnum,intatime)//以尾插法建立候车区的队列链表{structparkcar*p;p=(structparkcar*)malloc(sizeof(structparkcar));p-num=carnum;p-time=atime;if(head==NULL)head=p;elserear-next=p;rear=p;rear-next=NULL;returnhead;}voidleave(void){longcarnum;intltime,dtime;//离开时间,停车时间intsave=0;inti=1,flag0;flag0=flag;//flag0用来存储刚调用离开函数时flag的值structparkcar*p;printf(pleaseinputcarnumberandleavetime!\n);scanf(%ld%d,&carnum,<ime);fflush(stdin);while(pc[flag-1].num!=carnum)//从栈顶往下找要离开的那辆车{tc[save].num=pc[flag-1].num;tc[save].time=pc[flag-1].time;tc[save].next=pc[flag-1].next;if(flag==1&&pc[0].num!=carnum)//如果找到栈底都没有这辆车,则返回,并将存储着刚调用离开函数时flag的值,即flag0重新{//赋值给flag,避免在没有车辆离开的情况下对全局变量flag进行修改而导致错误printf(Thiscarisnotfounded!\n);flag=flag0;return;}flag--;save++;}dtime=ltime-pc[flag-1].time;//停车时间的计算if(dtime0)//如果输入的离开时间小于到达时间则重新输入离开时间{printf(Theleavetimeisillegal,pleaseinputtheleavetimeagain\n);scanf(%d,<ime);fflush(stdin);dtime=ltime-pc[flag-1].time;}printf(\tparktime:%d\n,dtime);printf(\tcost:%d\n,dtime*price);//输出停车时间和费用while(save!=0)//当车辆离开后,将缓存栈里的车回到停车场{if(i--)flag--;//因为执行完上一个while循环后flag少执行了一次减一操作,通过控制i来让flag在这个循环里只减一次。但flag--save--;//放在while(save!=0)外面,这样对某些输入会有bug。也就是只有当缓存栈里有车时才需要flag做一次减一操作pc[flag].num=tc[save].num;pc[flag].time=tc[save].time;flag++;}if(head!=NULL)//如果候车区不空,则将队首第一辆车进入停车场{p=head;pc[flag].num=p-num;pc[flag].time=ltime;pc[flag].next=p-next;flag++;printf(\t'%ld'carinpark,arrivetime:%d\n,p-num,ltime);//显示从候车区进停车场的车辆车牌号和进入时间head=head-next;free(p);}}voiddisplay_P(void)//从栈顶往栈底显示停车场的车辆信息{intflag1;flag1=flag;//用flag1记录此时的flag,避免对全局变量进行操作printf(\tpark_carnumarrive_time\n);fflush(stdin);while((flag1)!=0){printf(\t%ld%d\n,pc[flag1-1].num,pc[flag1-1].time);flag1--;}}voiddisplay_W(void)//从队首往队尾显示候车区的车辆信息{structparkcar*w;w=head;printf(\twait_carnumarrive_time\n);while(w!=NULL){printf(\t%ld%d\n,w-num,w-time);w=w-next;}free(w);}/*可参考的测试数据,含一定健壮性,复制粘贴可用DA1015A10210PD10315D10115PA10320A10425A10530PWD10235PWD1042040PWE*/

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功