数据结构停车场问题实验报告Word文件下载.docx
《数据结构停车场问题实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构停车场问题实验报告Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
![数据结构停车场问题实验报告Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-2/1/3649e1a3-ef70-49a2-8906-354d4a3eacd4/3649e1a3-ef70-49a2-8906-354d4a3eacd41.gif)
6、详细设计
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"
);
}
程序结束,谢谢使用!
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);
停车场已满,车辆进入便道,在%d号车位!
Q.queuesize);
else
该牌照的车已存在,输入有误,请重新输入\n"
时间输入有误,请重新输入!
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=车牌号
//该车离开
车进入停车场时间:
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号车库!
从现在开始计时,现在时间为:
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);
//前面的车进入队尾
您的车牌号为%d的车辆未进入车库从便道直接离开,费用为0!
e.num);
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;
//队列(便道)
StatusGetTop(SqStackS,CarNode&
//返回栈顶元素
if(S.top==S.base)
returnERROR;
e=*(S.top-1);
returnTRUE;
StatusPop(SqStack&
S,CarNode&
//删除栈顶元素
e=*--S.top;
StatusPush(SqStack&
S,CarNodee){//插入元素为新的栈顶元素(在栈不满的前提下)
if(S.top-S.base>
=MAX)
*S.top++=e;
StatusDeQueue(LinkQueue&
//删除队头元素(带头结点)
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&
if(S.top