实验三栈和队列的应用.docx
- 文档编号:24404857
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:14
- 大小:30.46KB
实验三栈和队列的应用.docx
《实验三栈和队列的应用.docx》由会员分享,可在线阅读,更多相关《实验三栈和队列的应用.docx(14页珍藏版)》请在冰豆网上搜索。
实验三栈和队列的应用
一、实验目的
1掌握栈的数据类型描述及栈的特点;
2掌握栈的顺序存储结构的特点及算法描述;
3掌握队列的数据类型描述及链式存储结构的特点和算法描述。
二、实验内容
停车场管理。
设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。
车辆按到达停车场时间的先后依次从停车场最里面向大95E8口处停放(最先到达的第一辆车停放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。
停车场内如有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。
试编程模拟停车场管理。
三、算法描述
提示:
可以将停车场定义成一个顺序栈s1,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,故还必须有一个临时的顺序栈s2,存放让道的车辆。
当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。
若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈并进栈到s2中,让x离开并收取停车费,然后,再把s2中的所有车辆退栈并重新进入s1栈,最后,将链队列q的队头车辆进栈到s1中并删除队头车辆。
若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。
车辆的数据可以表示为(车辆编号,到达/离开时间)。
四.程序清单:
#include
usingnamespacestd;
constintStackSize=5;
classSeqStack
{
public:
SeqStack(){top=-1;}
~SeqStack(){};
voidPush(intx);
voidPush2(intx);
int*Return();
intPop(inty);
intCount();
voidPrintStack();
private:
intdata[StackSize];
inttop;
};
//入栈
voidSeqStack:
:
Push(intx)
{
if(top>=StackSize-1)throw"上溢";
for(inti=0;i<=top+1;i++)
{
if(data[i]==x)
{
cout<<"该车牌已经存在!
请重新输入:
";
i=-1;
cin>>x;
}
}
top++;
data[top]=x;
}
//返回数组地址
int*SeqStack:
:
Return()
{
returndata;
}
//临时栈
voidSeqStack:
:
Push2(intx)
{
top++;
data[top]=x;
}
//输出函数
voidSeqStack:
:
PrintStack()
{
for(inti=0;i<=top;i++)
cout<<"位置为"<
"< } //出栈 intSeqStack: : Pop(inty) { if(top==-1)throw"下溢"; intx; x=data[top--]; if(y==top+2)data[top+1]=123456789; if(top==-1)data[top+1]=123456789; returnx; } //数数 intSeqStack: : Count() { returntop; } //队列 structNode { intdata; Node*next; }; classLinkQueue { public: LinkQueue(); voidEnQueue(intx,int*q); voidxzDeQueue(intx); intCount(); intDeQueue(); private: Node*front,*rear; }; //构造函数 LinkQueue: : LinkQueue() { Node*s=newNode; s->next=NULL; front=rear=s; } //入队 voidLinkQueue: : EnQueue(intx,int*q) { Node*s=newNode; Node*p=newNode; p=front; while(p) { if(p->data==x) { cout<<"便道已有该车牌号,请重新输入: "; cin>>x; for(inti=0;i<5;i++) { if(x==q[i]) { cout<<"停车场已有该车牌号,请重新输入: "; cin>>x; i=-1; } } p=front; } p=p->next; } s->data=x; s->next=NULL; rear->next=s; rear=s; } //出队 intLinkQueue: : DeQueue() { if(front==rear)throw"便道无车辆"; Node*p=newNode; intx; p=front->next; x=p->data; front->next=p->next; if(p->next==NULL)rear=front; deletep; returnx; } //计算结点数 intLinkQueue: : Count() { Node*p=newNode; p=front; inti=0; while(p&&p->next! =NULL) { p=p->next; i++; } returni; } //选择性出队 voidLinkQueue: : xzDeQueue(intx) { if(rear==front)throw"便道无车辆"; Node*p=newNode; p=front; inty; inti=0; for(;p->next! =NULL;p=p->next) { if(p->next->data==x) if(p->next->next! =NULL) { Node*q=newNode; q=p->next; y=q->data; p->next=q->next; i=1; deleteq; cout<<"车牌号为: "< "< break; } else { Node*q=newNode; q=p->next; y=q->data; p->next=NULL; i=1; deleteq; if(front->next==NULL)rear=front; cout<<"车牌号为: "< "< break; } } if(i==0)cout<<"无车牌号为: "< "< } voidmain() { SeqStacka;//a是作为停车场的栈 SeqStackb;//b是作为临时存放车辆的栈 LinkQueuec;//c是作为便道的队列 cout<<"\t\t\t\t1.车辆进入"< cout<<"\t\t\t\t2.车辆离开"< cout<<"\t\t\t\t3.查看车牌号"< cout<<"\t\t\t\t4.便道车辆离开"< cout<<"\t\t\t\t5.修改费用单价(默认1元/小时)"< cout<<"\t\t\t\t6.退出系统"< intzl;//zl为操作指令 intxh1=1;//xh1为菜单最外层的循环控制变量 inttime[100];//记录各车辆进入停车场的时间 intt1=0;//作为车辆对应的时间编号 intmoney=1; while(xh1==1) { cout<<"请选择指令: "; cin>>zl; switch(zl) { case1: try{ intn1=a.Count(); intn; cout<<"请输入车牌号: "; cin>>n; if(n1==4) { int*Num=a.Return(); for(inti=0;i<=4;i++) if(Num[i]==n) { cout<<"停车场已有该车牌号,请重新输入! "; cin>>n; i=-1; } int*CarNum=a.Return(); c.EnQueue(n,CarNum); cout<<"停车场已满,请在便道等候! "< break; } a.Push(n); cout<<"请输入进入时间: "; cin>>time[t1]; while(time[t1]<0||time[t1]>=24) { cout<<"请输入正确的时间(0~23时): "; cin>>time[t1]; } t1++; } catch(char*s){cout< break; case2: try{intn2;//离开车辆的编号 cout<<"请输入要离开的车的位置: "; cin>>n2; if(a.Count()+1==0) { cout<<"该停车场没有车辆,请选择其他操作! "; break; } else while(n2<1||n2>a.Count()+1) { cout<<"请输入1~"< 请重新输入: "; cin>>n2; } intj=a.Count(); for(inti=0;i<(j+1-n2);i++) b.Push2(a.Pop(n2)); a.Pop(n2); intj2=b.Count(); for(inti1=0;i1<=j2;i1++) a.Push(b.Pop(n2)); intj3=c.Count(); inttime1; cout<<"请输入离开时间: "; cin>>time1; while(time1<0||time1>23) { cout<<"请输入正确的时间(0~23时): "; cin>>time1; } intday=0; if(time1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 栈和队列的应用 实验 队列 应用