实验三栈和队列的应用报告.docx
《实验三栈和队列的应用报告.docx》由会员分享,可在线阅读,更多相关《实验三栈和队列的应用报告.docx(12页珍藏版)》请在冰豆网上搜索。
![实验三栈和队列的应用报告.docx](https://file1.bdocx.com/fileroot1/2022-11/28/90019d27-e990-4097-ba0e-ba639290f0a3/90019d27-e990-4097-ba0e-ba639290f0a31.gif)
实验三栈和队列的应用报告
数据结构实验报告
(实验三栈和队列的应用)
专业:
______________
班级:
______________
姓名:
______________
学号:
_____________
指导老师:
______________
评分:
_______________
实验三栈和队列的应用
一、实验目的
1掌握栈的数据类型描述及栈的特点;
2掌握栈的顺序存储结构的特点及算法描述;
3掌握队列的数据类型描述及链式存储结构的特点和算法描述。
二、实验内容
停车场管理。
设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。
车辆按到达停车场时间的先后依次从停车场最里面向大门口处停放(最先到达的第一辆车停放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。
停车场内如有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。
试编程模拟停车场管理。
3、算法描述
将停车场定义成一个顺序栈s1,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,故还必须有一个临时的顺序栈s2,存放让道的车辆。
当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。
若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈并进栈到s2中,让x离开并收取停车费,然后,再把s2中的所有车辆退栈并重新进入s1栈,最后,将链队列q的队头车辆进栈到s1中并删除队头车辆。
若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。
4、程序清单
#include
usingnamespacestd;
#defineOK1
#defineOVERFLOW-1
typedefstruct
{
intnum;//车牌
inttime;//时间
}Car;
typedefstruct
{
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;
returnOK;
}
intpush(sqstack&s,Care)//入栈
{
*s.top++=e;
returnOK;
}
Carpop(sqstack&s,Car&e)//出栈
{
if(s.top==s.base)cout<<"错误!
"<e=*--s.top;
returne;
}
intInitQueue(LinkQueue&Q)//构造队列
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
if(!
Q.front)exit(OVERFLOW);
Q.front->next=NULL;
returnOK;
}
intDestroyQueue(LinkQueue&Q)//销毁队列
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
returnOK;
}
intEnQueue(LinkQueue&Q,Care)//元素进入队列
{
Queueptrp;
Q.rear->data=e;
p=(Queueptr)malloc(sizeof(QNode));
if(!
p)exit(OVERFLOW);
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
returnOK;
}
CarDeQueue(LinkQueue&Q,Car&e)//元素出队列并删除
{
if(Q.front==Q.rear)cout<<"错误!
"<Queueptrp=Q.front;
e=p->data;
Q.front=p->next;
if(Q.rear==p->next)Q.rear=Q.front;
free(p);
returne;
}
voidprint(intcost,intouttime,charitime)
{
cout<<"收费标准:
"<cout<<"停车时间:
"<"<cout<cout<<"--------------------------------------------------------------------"<}
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);
cout<if(x!
=1)
cout<<"要为该车让路的车辆:
";
else
cout<<"不必为该车让路,该车可直接从车场开走!
";
}
elsepush(temp,o);
}
while(temp.top!
=temp.base)
{
p=pop(temp,o);
if(find==1&&x!
=1)
cout<
";//按顺序输出需让路的车辆的位置
push(park,p);
}
return(find);
}
intSearchWait(intnum,intouttime)//查找便道上要离开的车辆和输出相关信息
{
intfind=0,k=j;
Carc,e;
while(find==0&&k!
=1)
{
c=DeQueue(wait,e);
k--;
if(c.num==num)
{
find=1;
cout<<"-----------------------------该车在便道内----------------------------"<print(b,outtime,c.time);
}
elseEnQueue(wait,c);//不离开的车辆从新入队列wait
}
return(find);
}
voidOutCar()
{
intouttime,num;
Carl;
cout<<"请输入要开走车的车牌:
";
cin>>num;
do
{
cout<<"请输入该车出车场的时间:
";
cin>>outtime;
if(outtime<=car_info.time)
cout<<"!
!
!
!
时间必须递增,请重新输入!
!
!
!
"<}while(outtime<=car_info.time);
cout<if(SearchPark(num,outtime)!
=0)
{
if(wait.front!
=wait.rear)
{
push(park,DeQueue(wait,l));
cout<cout<<"请便道内车牌为"<"<cout<j--;
i++;
}
elsecout<<"便道上没有车进入车场!
"<}
elseif(SearchWait(num,outtime)!
=0);
else
cout<"<}
voidInCar()
{
intnum;
inttime;
cout<<"请输入该车的车牌:
";
cin>>num;
car_info.num=num;
do
{
cout<<"请输入该车进车场的时间:
";
cin>>time;
if(time<=car_info.time)
{
cout<<"!
!
!
!
时间必须为递增,请重新输入!
!
!
!
!
"<cout<}
else
{
car_info.time=time;
break;
}
}while(time<=car_info.time);
if(park.top-park.base{
push(park,car_info);
cout<<"该车停在停车场的第"<
"<i++;
}
else//当车场满后,车停在便道上
{
EnQueue(wait,car_info);
cout<<"该车停在便道上!
"<j++;
}
}
voidExit()
{
DestroyStack(park);//销毁栈
DestroyStack(temp);//销毁栈
DestroyQueue(wait);//销毁队列
cout<<"谢谢使用停车场管理系统!
"<}
voidmain()
{
charc;
car_info.time=0;
cout<<"停车场管理系统"<cout<<"请输入停车场内总车位数:
";
cin>>n;
InitStack(park);//初始化栈park
InitQueue(wait);//初始化队列wait
cout<<"请输入停车场内的收费标准(元/小时):
";
cin>>m;
cout<<"请输入便道内的收费标准(元/小时):
";
cin>>b;
do
{
cout<cout<<"**************菜*单************"<cout<<"ii"<cout<<"ia/A-->车辆进站i"<cout<<"ib/D-->车辆出站i"<cout<<"ie/E-->退出系统i"<cout<<"********************************"<cout<<"请输入(A,D,E):
";
cin>>c;
switch(c)
{
case'A':
case'a':
InCar();break;
case'D':
case'd':
OutCar();break;
case'E':
case'e':
Exit();break;
default:
cout<!
!
!
输入错误,请重新输入!
!
!
!
"<}
if(c=='E'||c=='e')break;
}while(c!
='E'||c!
='e');
}
5、运行结果:
1.输入
2.选择菜单,进车到停车场和便道
3.车辆退出停车场和便道
5、心得体会
些次实验难度比较大,考查了链栈与链队列的基本知识灵活地结合了链栈与链队列的知识运用,需对链栈和链队列有一定熟悉度才能更好地做出实验。
这个实验让我更深一层了解了链栈和链队列,学会结合运用链栈和链队列,灵活实现所需的功能。