实验三 栈和队列的应用_3栈和队列实验应用

2020-02-29 其他范文 下载本文

实验三 栈和队列的应用由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“3栈和队列实验应用”。

一、实验目的掌握栈的数据类型描述及栈的特点;掌握栈的顺序存储结构的特点及算法描述;掌握队列的数据类型描述及链式存储结构的特点和算法描述。

二、实验内容

停车场管理。设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后依次从停车场最里面向大95E8口处停放(最先到达的第一辆车停放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。停车场内如有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。试编程模拟停车场管理。

三、算法描述

提示:可以将停车场定义成一个顺序栈s1,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,故还必须有一个临时的顺序栈s2,存放让道的车辆。

当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈并进栈到s2中,让x离开并收取停车费,然后,再把s2中的所有车辆退栈并重新进入s1栈,最后,将链队列q的队头车辆进栈到s1中并删除队头车辆。若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。

车辆的数据可以表示为(车辆编号,到达/离开时间)。

四.程序清单: #include using namespace std;const int StackSize=5;cla SeqStack { public:

SeqStack(){top=-1;} ~SeqStack(){};void Push(int x);void Push2(int x);int *Return();int Pop(int y);int Count();void PrintStack();private: int data[StackSize];int top;};//入栈

void SeqStack::Push(int x){ if(top>=StackSize-1)throw“上溢”;for(int i=0;i

if(data[i]==x)

{

cout

i=-1;

cin>>x;

} } top++;data[top]=x;} //返回数组地址

int *SeqStack::Return(){ return data;} //临时栈

void SeqStack::Push2(int x){ top++;data[top]=x;

} //输出函数

void SeqStack::PrintStack(){ for(int i=0;i

cout

int SeqStack::Pop(int y){ if(top==-1)throw“下溢”;int x;x=data[top--];if(y==top+2)data[top+1]=123456789;if(top==-1)data[top+1]=123456789;return x;} //数数

int SeqStack::Count(){ return top;}

//队列

struct Node { int data;Node *next;};cla LinkQueue { public: LinkQueue();void EnQueue(int x,int *q);void xzDeQueue(int x);int Count();int DeQueue();

private: Node *front,*rear;};//构造函数

LinkQueue::LinkQueue(){ Node *s=new Node;s->next=NULL;front=rear=s;} //入队

void LinkQueue::EnQueue(int x,int *q){ Node *s=new Node;Node *p=new Node;p=front;while(p){

if(p->data ==x)

{

cout

cin>>x;

for(int i=0;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;} //出队

int LinkQueue::DeQueue(){ if(front==rear)throw“便道无车辆”;Node *p=new Node;int x;p=front->next;x=p->data;front->next =p->next;if(p->next ==NULL)rear=front;delete p;return x;} //计算结点数

int LinkQueue::Count(){ Node *p=new Node;p=front;int i=0;while(p&&p->next!=NULL){

p=p->next;

i++;} return i;} //选择性出队

void LinkQueue::xzDeQueue(int x){ if(rear==front)throw“便道无车辆”;Node *p=new Node;p=front;int y;int i=0;for(;p->next!=NULL;p=p->next)

{

if(p->next->data ==x)

if(p->next->next!=NULL)

{

Node *q=new Node;

q=p->next;

y=q->data;

p->next =q->next;

i=1;

delete q;

cout

break;

}

else

{

Node *q=new Node;

q=p->next;

y=q->data;

p->next =NULL;

i=1;

delete q;

if(front->next==NULL)rear=front;

cout

break;

}

} if(i==0)cout

SeqStack b;//b是作为临时存放车辆的栈

LinkQueue c;//c是作为便道的队列

cout

cout

int xh1=1;//xh1为菜单最外层的循环控制变量

int time[100];//记录各车辆进入停车场的时间

int t1=0;//作为车辆对应的时间编号

int money=1;while(xh1==1){

cout

cin>>zl;

switch(zl)

{

case 1:

try{

int n1=a.Count();

int n;

cout

cin>>n;

if(n1==4)

{

int *Num=a.Return();

for(int i=0;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]=24)

{

cout

cin>>time[t1];

}

t1++;

}

catch(char*s){cout

break;

case 2:

try{int n2;//离开车辆的编号

cout

cin>>n2;

if(a.Count()+1==0)

{

cout

break;

}

else

while(n2a.Count()+1)

{

cout

cin>>n2;

}

int j=a.Count();

for(int i=0;i

b.Push2(a.Pop(n2));

a.Pop(n2);

int j2=b.Count();

for(int i1=0;i1

a.Push(b.Pop(n2));

int j3=c.Count();

int time1;

cout

cin>>time1;

while(time123)

{

cout

cin>>time1;

}

int day=0;

if(time1

{

cout

cin>>day;

while(day

{

cout

cin>>day;

}

}

cout

for(int i2=0;i2

time[n2-1+i2]=time[n2+i2];

t1--;

if(j3!=0)

{

a.Push(c.DeQueue());

cout

cout

cin>>time[t1];

while(time[t1]=24)

{

cout

cin>>time[t1];

}

t1++;

}

}catch(char *s){cout

break;

case 3:

a.PrintStack();break;

case 4:

int n3;

cout

cin>>n3;try{

c.xzDeQueue(n3);}catch(char*s){cout

break;

case 5:

cout

cin>>money;

cout

cout

break;

case 6:

xh1=0;

break;

} } system(“pause”);}

心得体会:

完成时间:2010-10-30

《实验三 栈和队列的应用.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
实验三 栈和队列的应用
点击下载文档
相关专题 3栈和队列实验应用 队列 3栈和队列实验应用 队列
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文