停车场问题 含 完整C程序代码 优选.docx
- 文档编号:8772343
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:8
- 大小:17.21KB
停车场问题 含 完整C程序代码 优选.docx
《停车场问题 含 完整C程序代码 优选.docx》由会员分享,可在线阅读,更多相关《停车场问题 含 完整C程序代码 优选.docx(8页珍藏版)》请在冰豆网上搜索。
停车场问题含完整C程序代码优选
wo最新文件----------------仅供参考--------------------已改成-----------word文本---------------------方便更改
rd
停车场问题完整C程序代码
1)内容:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的在最北端),若停车场内已经停满n辆车,那么后来的车只能在场外等候,一旦有车开走,则等候在第一位的车即可开入(这是一个队列设长度为m);当停车场内某辆车需要开出,则在它之后的车辆必须给它让道,当这辆车驶出停车场后,其他车辆按序入栈。
每辆车按时间收费。
2)要求:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。
每一组输入数据包括三个数据:
汽车的“到达”(’A’表示)或“离去”(’D’表示)信息,汽车标识(牌照号)以及到达或离去的时刻。
对每一组输入数据进行
操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。
栈以顺序结构实现,队列以链表结构实现。
#include
#include
#definepmax3//定义停车场的最大容车量为3
#defineprice2//停车单价为2
staticintflag=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");
else
leave();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(dtime<0)//如果输入的离开时间小于到达时间则重新输入离开时间
{
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);
}
/*
可参考的测试数据,含一定健壮性,复制粘贴可用
D
A
1015
A
10210
P
D
10315
D
10115
P
A
10320
A
10425
A
10530
P
W
D
10235
P
W
D
10420
40
P
W
E
*/
最新文件----------------仅供参考--------------------已改成-----------word文本---------------------方便更改
赠人玫瑰,手留余香。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场问题 完整C程序代码 优选 停车场 问题 完整 程序代码