数据结构停车场问题实验报告Word文档格式.docx
《数据结构停车场问题实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构停车场问题实验报告Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
![数据结构停车场问题实验报告Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/b387001a-c9ae-4c39-8ad6-613174401a3c/b387001a-c9ae-4c39-8ad6-613174401a3c1.gif)
附俎化两乍桟Euler和
Temp段一个讥列Wail
车到达
旱■
退出
Room杓车站煜临时慢
退岀列袤
显示
便逋车进车场
'
■troom
t
舌
元Etiter
栈Enicr元素岀険
队fiWat中
1
沅畫出仇
限刃中元鶯进找
六、详细设计
1.本程序主要包含四个模块
1)主程序模块
intmain(){
Initialization();
CarNodecar;
SqStackPark,TempPark;
LinkQueueQ;
InitStack(Park);
InitStack(TempPark);
InitQueue(Q);
while((scanf("
%c%d%d"
&
car.event,&
car.num,&
car.time))&
&
(car.event!
='
e'
car.event!
E'
)){
getchar();
switch(car.event)
{
case'
A'
:
a'
Arrive(Park,Q,car);
break;
D'
d'
Leave(Park,TempPark,Q,car);
default:
printf("
您的第一个数据输入有误!
\n"
);
}
printf("
程序结束,谢谢使用!
return0;
2)分别构造空栈和空队列
栈:
StatusInitStack(SqStack&
S){//构造一个空栈
S.Stacksize=0;
S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));
if(!
S.base){
exit(OVERFLOW);
存储空间分配失败"
S.top=S.base;
returnOK;
队列:
StatusInitQueue(LinkQueue&
Q){//构造一个空队列(带头结点)
Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));
Q.front){
Q.front->
next=NULL;
Q.queuesize=0;
3)车辆到达处理
StatusArrive(SqStack&
S,LinkQueue&
Q,CarNode&
e){//车辆到达处理if((S.top-1)->
time<
=e.time){//时间处理
Check_Stack(S,e)&
!
Check_Queue(Q,e)){//是否已存在if(S.top-S.base<
MAX){
Push(S,e);
成功进入停车场,在%d号车库!
S.top-S.base);
else{
EnQueue(Q,e);
printf(”停车场已满,车辆进入便道,在%d号车位!
Q.queuesize);
else
该牌照的车已存在,输入有误,请重新输入\n"
returnOK;
时间输入有误,请重新输入!
returnFALSE;
4)车辆离开处理
StatusLeave(SqStack&
S,SqStack&
TempS,LinkQueue&
e){//车辆离开处理
CarNodea;
intleatime,leanum;
intentertime;
//进入停车场时间
intcost;
(Check_Stack(S,e)||Check_Queue(Q,e)))
数据输入错误,本停车场内无所查询车辆,请重新输入!
returntrue;
if(Check_Stack(S,e))//若需要离开的车辆在停车场{
if(e.num==(S.top-1)->
num)//车辆处在栈顶
Pop(S,a);
leatime=e.time;
leanum=e.num;
entertime=a.time;
车辆进入车库时间:
%d\t现在(离开)时间:
%d\t停留时
「可:
%d\t\n"
entertime,leatime,leatime-entertime);
else//车辆处在栈中间
do{
Pop(S,a);
//从栈中依次退出
Push(TempS,a);
//依次进入临时栈
}while((S.top-1)->
num!
=e.num);
//直到top指针下一个位置的num=车牌号Pop(S,a);
//该车离开
车进入停车场时间:
%d\t\n"
do{//其余车辆按原来次序返回停车场
Pop(TempS,a);
Push(S,a);
}while(TempS.top!
=TempS.base);
//条件与上面不同,此时是全部回去
cost=(leatime-entertime)*price;
if(cost>
=0)
您的车牌号为%d的车应交纳的费用是:
%d\n"
leanum,cost);
if(Q.front!
=Q.rear){//队列不空的话从便道进停车场
DeQueue(Q,a);
if(a.time<
leatime)//便道车辆进车库时间应该比车库车辆离开时间晚
entertime=leatime;
a.time=leatime;
//该车进入停车场
车牌号为%d的车辆从便道上进入%d号车库!
从现在开始计时,现在时间
为:
%d\n"
a.num,S.top-S.base,a.time);
elseif(Check_Queue(Q,e)){//从便道直接离开
EnQueue(Q,a);
}while(Q.front->
next->
data.num!
DeQueue(Q,e);
//前面的车进入队尾
0!
e.num);
您的车牌号为%d的车辆未进入车库从便道直接离开,费用为}
returntrue;
2.主要设计程序如下
#include<
stdio.h>
malloc.h>
stdlib.h>
#defineMAX2//停车场容量
#defineprice2//单价
#defineOK1
#defineFALSE0
#defineTRUE1
#defineERROR-1
#defineOVERFLOW-2
typedefintStatus;
//=================================================================typedefstructCarNode{
charevent;
intnum;
inttime;
}CarNode;
//车辆信息结点
typedefstructSqStack{
CarNode*base;
CarNode*top;
intStacksize;
}SqStack;
//栈(停车场)
typedefstructQNode{
CarNodedata;
structQNode*next;
}QueueNode;
//便道结点
typedefstructLinkQueue{
QueueNode*front;
QueueNode*rear;
intqueuesize;
}LinkQueue;
//队列(便道)
//=====================================================================
StatusInitStack(SqStack&
StatusInitQueue(LinkQueue&
StatusGetTop(SqStackS,CarNode&
e){//返回栈顶元素
if(S.top==S.base)
returnERROR;
e=*(S.top-1);
returnTRUE;
StatusPop(SqStack&
S,CarNode&
e){//删除栈顶元素
e=*--S.top;
StatusPush(SqStack&
S,CarNodee){//插入元素为新的栈顶元素(在栈不满的前提下)if(S.top-S.base>
=MAX)
*S.top++=e;
StatusDeQueue(LinkQueue&
e){//删除队头元素(带头结点)
if(Q.rear==Q.front)
QueueNode*p=Q.front->
next;
e=p->
data;
next=p->
if(p==Q.rear)
Q.rear=Q.front;
free(p);
Q.queuesize--;
StatusEnQueue(LinkQueue&
Q,CarNodee){//插入新的队尾元素
QueueNode*p=(QueueNode*)malloc(sizeof(QueueNode));
p)
p->
data=e;
Q.rear->
next=p;
Q.rear=p;
Q.queuesize++;
//=====================================================================StatusCheck_Stack(SqStack&
S,CarNodee){//车辆到达时车库内是否有同名车
CarNode*Temp=S.base;
while((Temp!
=(S.top))&
(Temp->
=e.num))
Temp++;
if((Temp==S.top))
StatusCheck_Queue(LinkQueue&
Q,CarNodee){//车辆到达时便道上是否有同名车
QueueNode*Temp=Q.front;
=Q.rear)&
(Temp->
Temp=Temp->
if((Temp==Q.rear)&
}//=====================================================================StatusArrive(SqStack&
e){//车辆到达处理
if((S.top-1)->
Check_Queue(Q,e)){//是否已存在
if(S.top-S.base<
//=======================================================
e)
{//车辆离开处理
if(Check_Stack(S,e))//若需要离开的车辆在停车场
从现在开始计时,现在时间为:
您的车牌号为%d的车辆未进入车库从便道直接离开,费用为0!
voidInitialization(){//初始化程序
姓名:
杨智伟学号:
2012040651\n"
==========================================================\n"
*停车场管理模拟程序*\n"
printf(”请依次输入车辆到达(A/a)/离去(D/d)/结束(E/e)信息、车牌号以及当前时间:
\n\n"
}
InitStack(TempPark);
&
car.event,&
car.num,&
))
//除去输入结束时的回车
您的第一个数据输入有误!
程序结束,谢谢使用!
七、程序运行截图
1.交互界面
2.车辆进入
3.车辆离去
IBMam■»
bmbmam
停车场管理模抱程序
请嵌次输入车辆到达5”离去结束车牌号以及当前时间*詁嬴心幵坍在丄号车爭
2iH
成功进入停车场■在2号车库!
车逬A#$场时咼5现在(离幵)时葆弓停留时间汩
恆的车脚寻为1的车应交纳的费用是洱
4.停车场已满进入便道
停车场管理模拟程序
请恢次输入车辆到达<A/aV»
去结束GAO信息"
车牌号以及当前时间=
隹打和人停车九在i耳车库申
a210
成功进入停车场■在2号车库?
«
皐址入焉芙场时护那在(頁开)时间次停留时间迪
您芮车牌舟怙1舸车应交纳血费用