实验三栈和队列的应用报告Word文档下载推荐.docx
《实验三栈和队列的应用报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验三栈和队列的应用报告Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。
4、程序清单
#include<
iostream>
usingnamespacestd;
#defineOK1
#defineOVERFLOW-1
typedefstruct
{
intnum;
//车牌
inttime;
//时间
}Car;
Car*base;
Car*top;
//定义栈顶指针
intstacksize;
//定义存储空间
}sqstack;
typedefstructQNode//链式队列存储结构
Cardata;
structQNode*next;
}QNode,*Queueptr;
typedefstruct//存储便道停车信息的队列
Queueptrfront;
//队头指针
Queueptrrear;
//队尾指针
}LinkQueue;
sqstackpark,temp;
//定义栈的全局变量
LinkQueuewait;
//定义队列的全局变量
Carcar_info;
//定义类的全局变量
intn,i=1,j=1,m,b;
//定义整型变量,m为输入停车场内收费标准,b为便道上收费标准
intInitStack(sqstack&
s)//建立空栈
s.base=(Car*)malloc(n*sizeof(Car));
if(!
s.base)exit(OVERFLOW);
s.top=s.base;
s.stacksize=n;
returnOK;
}
intDestroyStack(sqstack&
s)//销毁栈s
free(s.base);
s.base=s.top=NULL;
s.stacksize=0;
intpush(sqstack&
s,Care)//入栈
*s.top++=e;
Carpop(sqstack&
s,Car&
e)//出栈
if(s.top==s.base)cout<
<
"
错误!
<
endl;
e=*--s.top;
returne;
intInitQueue(LinkQueue&
Q)//构造队列
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
Q.front)exit(OVERFLOW);
Q.front->
next=NULL;
intDestroyQueue(LinkQueue&
Q)//销毁队列
while(Q.front)
{
Q.rear=Q.front->
next;
free(Q.front);
Q.front=Q.rear;
}
intEnQueue(LinkQueue&
Q,Care)//元素进入队列
Queueptrp;
Q.rear->
data=e;
p=(Queueptr)malloc(sizeof(QNode));
p)exit(OVERFLOW);
p->
next=p;
Q.rear=p;
CarDeQueue(LinkQueue&
Q,Car&
e)//元素出队列并删除
if(Q.front==Q.rear)cout<
Queueptrp=Q.front;
e=p->
data;
Q.front=p->
if(Q.rear==p->
next)Q.rear=Q.front;
free(p);
voidprint(intcost,intouttime,charitime)
cout<
收费标准:
cost<
元/小时"
停车时间:
outtime-itime<
小时收费金额:
cost*(outtime-itime)<
元"
;
--------------------------------------------------------------------"
intSearchPark(intnum,intouttime)//查找车场内要离开的车辆和输出相关信息
intfind=0,x=0;
InitStack(temp);
//初始化栈
Caro,p;
while(find==0&
&
park.base!
=park.top)
o=pop(park,p);
x+=1;
if(o.num==num)
{
find=1;
i-=1;
cout<
---------------------------该车在车场内-----------------------------"
print(m,outtime,o.time);
if(x!
=1)
cout<
要为该车让路的车辆:
"
else
不必为该车让路,该车可直接从车场开走!
}
elsepush(temp,o);
while(temp.top!
=temp.base)
p=pop(temp,o);
if(find==1&
x!
p.num<
-->
//按顺序输出需让路的车辆的位置
push(park,p);
return(find);
intSearchWait(intnum,intouttime)//查找便道上要离开的车辆和输出相关信息
intfind=0,k=j;
Carc,e;
k!
=1)
c=DeQueue(wait,e);
k--;
if(c.num==num)
-----------------------------该车在便道内----------------------------"
print(b,outtime,c.time);
elseEnQueue(wait,c);
//不离开的车辆从新入队列wait
voidOutCar()
intouttime,num;
Carl;
请输入要开走车的车牌:
cin>
>
num;
do
请输入该车出车场的时间:
cin>
outtime;
if(outtime<
=car_info.time)
!
时间必须递增,请重新输入!
}while(outtime<
=car_info.time);
if(SearchPark(num,outtime)!
=0)
if(wait.front!
=wait.rear)
push(park,DeQueue(wait,l));
请便道内车牌为"
l.num<
的车进车场,停在停车场的第"
i<
号车位!
j--;
i++;
elsecout<
便道上没有车进入车场!
elseif(SearchWait(num,outtime)!
=0);
else
endl<
没有此车停在停车场和便道内!
voidInCar()
请输入该车的车牌:
car_info.num=num;
请输入该车进车场的时间:
time;
if(time<
=car_info.time)
时间必须为递增,请重新输入!
car_info.time=time;
break;
}while(time<
if(park.top-park.base<
park.stacksize)//有车从车场内开出后,便道上的车进入车场内
push(park,car_info);
该车停在停车场的第"
i++;
else//当车场满后,车停在便道上
EnQueue(wait,car_info);
该车停在便道上!
j++;
voidExit()
DestroyStack(park);
//销毁栈
DestroyStack(temp);
DestroyQueue(wait);
//销毁队列
谢谢使用停车场管理系统!
voidmain()
charc;
car_info.time=0;
cout<
停车场管理系统"
endl<
请输入停车场内总车位数:
cin>
n;
InitStack(park);
//初始化栈park
InitQueue(wait);
//初始化队列wait
请输入停车场内的收费标准(元/小时):
;
m;
请输入便道内的收费标准(元/小时):
b;
cout<
**************菜*单************"
ii"
ia/A-->
车辆进站i"
ib/D-->
车辆出站i"
ie/E-->
退出系统i"
********************************"
请输入(A,D,E):
cin>
c;
switch(c)
case'
A'
:
a'
InCar();
break;
D'
d'
OutCar();
E'
e'
Exit();
default:
cout<
!
输入错误,请重新输入!
if(c=='
||c=='
)break;
}while(c!
='
||c!
);
5、运行结果:
1.输入
2.选择菜单,进车到停车场和便道
3.车辆退出停车场和便道
5、心得体会
些次实验难度比较大,考查了链栈与链队列的基本知识灵活地结合了链栈与链队列的知识运用,需对链栈和链队列有一定熟悉度才能更好地做出实验。
这个实验让我更深一层了解了链栈和链队列,学会结合运用链栈和链队列,灵活实现所需的功能。