停车场问题含完整C程序代码.docx
《停车场问题含完整C程序代码.docx》由会员分享,可在线阅读,更多相关《停车场问题含完整C程序代码.docx(9页珍藏版)》请在冰豆网上搜索。
![停车场问题含完整C程序代码.docx](https://file1.bdocx.com/fileroot1/2023-1/3/16f6fb9d-f15c-4286-a86f-683450546851/16f6fb9d-f15c-4286-a86f-6834505468511.gif)
停车场问题含完整C程序代码
最新文件仅供参考已改成word文本方
便更改
停车场问题完整c程序代码
1)内容:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个人门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(人门在最南端,最先到达的在最北端),若停车场内已经停满n辆车,那么后来的车只能在场外等候,一旦有车开走,则等候在第一位的车即可开入(这是一个队列设长度为m);当停车场内某辆车需要开出,则在它之后的车辆必须给它让道,当这辆车驶出停车场后,其他车辆按序入栈。
每辆车按时间收费。
2)要求:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。
每一组输入数据包括三个数据:
汽车的"到达"(A表示)或"离去"("表示)信息,汽车标识(牌照号)以及到达或离去的时刻。
对每一组输入数据进行
操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。
栈以顺序结构实现,队列以链表结构实现。
#include
#include
#definepmax3
〃定义停车场的最大容车量为3
#defineprice2
〃停车单价为2
staticintflag=O;
〃全局变量,用来记录停车场车的数量
structparkcar
〃定义车辆的结构体
longnum;
inttime;
structparkcar*next;}*head,*rear;
structparkcarpc[pmax];
structparkcartc[pmax];
结构体数组
〃创建停车场的结构体数组
〃创建用来缓存停车场出来的车辆的
structparkcar*inqueue(longcarnumzintatime);
〃声明入队列函数,让车辆进入
候车区
voidarrive(void);
voidleave(void);
voiddisplay_P(void);
数
voiddisplay_W(void);
函数
intmain()
{
head=NULL;
针和尾指针
rear=NULL;
intstate=O;
======ParkcarMenu======\nn);
〃声明到达函数
〃声明离开函数
/廣明显示停车场车辆信息的函
〃声明显示侯车区车辆信息的
〃初始化队列头指
printfCV
/瀚出停车菜单
printf(H\t
price:
2\n");
printf("\tinput
state\nH);
A),后执行相应函数
printf(H\tA
arrive\nJ;
printf(H\tD
leave\nJ;
printf(H\tP
displaypark_car\nJ;
printf(H\tW
displaywait_car\rf);
printf(H\tE
quit\n”);
do
〃通过先输入状态(如
〃通过先输入状
〃如果停车场为空则
printf(”input:
\n“);
scanf(,,%c,,/&state);
fflush(stdin);
switch(state)
态(如A),后执行相应函数
{
case'A'larriveOjbreak;
case,D':
if(pc[flag-l].num==NULL)
输出为空
printf("Parkisempty!
\n");
else
leave();break;
caseP:
display_P();break;
case'W':
clisplay_W();break;
case'E':
break;
default:
printf("eirormessage,!
nputagain!
\rf);
〃当输入E
}
}while(state!
=,E,);
则退出
return0;
}
voidarrive(void)
{longcarnum;
intatime;
printf(Mpleaseinputcarnumberandarrivetime!
\nn);
scanf("%ld%d,,/&carnum,&atime);fflush(stdin);
if(flag!
=pmax)〃如果停
车场未满,则入停车场
{
pc[flag].num=carnum;
pc[flag].time=atime;
++flag;
}
else
〃否则
inqueue(carnunxatime);
囲唉车区
structparkcar才inqueue(longcarnumjntatime)
立候车区的队列链表
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=l,flagO;
〃以尾插法建
//flagO用来存储刚调用离开函数
时flag的值
structparkcar*p;
printf(npleaseinputcarnumberandleavetime!
\nJ;
scanf("%ld%d,,,&carnum,<ime);fflush(stdin);
while(pc[flag-l].num!
=carnum)〃从栈顶往下找要离开的那
辆车
{
tc[save].num=pc[flag-l].num;
tc[save].time=pc[flag-l].time;
tc[save].next=pc[flag-l].next;
if(flag==l&&pc[O].num!
=carnum)〃如果找到栈底都没
有这辆车,则返回,并将存储着刚调用离开函数时flag的值,即flagO重新
{〃赋值给flag,避
免在没有车辆离开的情况下对全局变量flag进行修改而导致错误
printf(nThiscarisnotfounded!
\nn);
flag=flagO;
return;
}
flag-;save++;
}
dtime=ltime-pc[flag-l].time;〃停车时间的计算
〃5口果输入的离开时间小于到达时间则重新输入离开时间
{
printf(nTheleavetimeisillegal,pleaseinputtheleavetimeagain\n”);scanf(,,%d,,,<ime);fflush(stdin);
dtime=ltime-pc[flag-l].time;
}
printf("\tparktime:
%d\rV:
dtime);
printf("\tcost:
%d\n"/dtime*price);〃输出停车时间和费用
while(save!
=O)〃当车辆离开后,
将缓存栈里的车回到停车场
{
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++;
printfC't'Wld'carinpark,arrivetime:
%d\n蔦p->numJtime);
进停车场的车辆车牌号和进入时间
head=head->next;
free(p);
}
}
voiddisplay_P(void)〃从栈
顶往栈底显示停车场的车辆信息
{
intflagl;
flagl=flag;〃用
flagl记录此时的flag,避免对全局变量进行操作
printfC'Xtpark^carnumairive_time\rf);fflush(stdin);
while((flagl)!
=O)
{
printf(H\t%ld%d\rCpc[flagl・l]・num,pc[flag:
lJ]・tirne);
flagl-;
}
〃从队首
voiddisplay_W(void)
往队尾显示候车区的车辆信息
{
structparkcar*w;
w=head;
printf(H\twait_carnumarrive_time\nH);
while(w!
=NULL)
{
printf(H\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
柿品WORD•仅供参考
榕品Word•仅供参考
40
P
W
E
*/
word文本
最新文件仅供参考已改成
方便更改
赠人玫瑰,手留余香。