数据结构 停车场管理 C++实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
一、实验目的
1.掌握栈的数据类型描述及栈的特点。

2.掌握栈的顺序和链式两种存储结构的特点及算法描述。

3.掌握五种基本运算及算法在两种不同存储结构上的实现。

4.掌握队列的数据类型描述及链式存储结构的特点和算法描述。

5.掌握队列的五种基本运算及在链式存储结构上的实现。

二、实验内容
停车场管理。

设有一个可以停放n辆汽车的狭长停车场(先进后出),它直有一个大门可以供车辆进出。

车辆按到停车场的时间先后依次从停车场最里面向大
门口处停放(最先到达的第一辆车放在停车场的最里面)。

如果停车场已经放满n
辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,
则排在便道上的第一辆车就可以进入停车场。

停车场若有其它车辆要离开,在它
之后进入停车场的车必须先退出停车场为它让路,待其车开出停车场后,这些车
在按原来的次序进停车场。

每辆车在离开停车场时,都应该根据它在停车场内停
留的时间长短交费。

如果停留在便道上的车没进停车场就要离开,允许其离开,
不收停车费,并且仍然保持在便道上的车辆次序。

试编程模拟停车场管理。

三、实验与算法分析
可以将停车场定义为一个顺序栈s1,便道定义为一个链队列q,而停车场中的某个车辆要离开,则在它后面进入停车场的车必须让道,让其离开,故还必须
有一个临时的顺序栈s2,存放让道的车辆。

当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。

若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈,并进栈到s2中,让
x离开并收取停车费,然后,再把s2中的所有元素退栈并重新进栈s1,最后,将
链队列q的队头元素进栈到s1中,并删除队头元素。

若有链队列q(便道)中的
元素y离开时,从链队列中删除该元素即可,不收停车费。

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

根据问题要求,在停车场内选择栈结构,来管理车辆,这样可以满足题目要求,让车辆先进后出。

停车位满后,停在便道上的车辆用队列这种结构,可以先
来先进停车场。

采用这两种结构可以方便管理车辆,也满足题目的要求。

四、可执行程序及注释
#include<iostream.h>
const int N=5; //停车场栈的长度
const int M=6; //单位时间内停车场收费值
typedef struct
{
int num; //车辆编号
int arrtime; //到达和离开时间
}elemtype;
struct seqstack
{
elemtype stack[N+1];
int top;
}s1,s2;
struct link
{
elemtype data;
link *next;
};
struct linkqueue
{
link *front,*rear;
}q;
seqstack inistack(seqstack S) //栈的初始化{
S.top=0;
return S;
}
seqstack push(seqstack S,elemtype x) //进栈{
S.top++;
S.stack[S.top]=x;
return S;
}
seqstack pop(seqstack S) //退栈
{
S.top--;
return S;
}
elemtype gettop(seqstack S) //取栈顶元素{
return S.stack[S.top];
}
int empty(seqstack S) //判栈空{
if(S.top==0)
return 1;
else return 0;
}
linkqueue iniqueue(linkqueue s) //栈队列初始化{
link *p;
p=new link;
p->next=NULL;
s.front=s.rear=p;
return s;
}
linkqueue enqueue(linkqueue s,elemtype x) //进队{
link *p;
p=new link;
p->data=x;
p->next=s.rear->next;
s.rear->next=p;
s.rear=p;
return s;
}
linkqueue dlqueue(linkqueue s) //出队{
link *p=s.front;
s.front=p->next;
delete p;
return s;
}
elemtype gethead(linkqueue s) //取队头元素{
return s.front->next->data;
}
int emptyqueue(linkqueue s)
{
if (s.front==s.rear)return 1;
else return 0;
}
void arrive(elemtype x)
{
if(s1.top==N)
q=enqueue(q,x);
else s1=push(s1,x); //进入停车场
}
//处理车辆离开的情形
void delive(elemtype x)
{
int f=1;
elemtype y;
link *r;
while((!empty(s1))&&(f==1))//在停车场中找要离开的车辆if (s1.stack[s1.top].num!=x.num)
{
y=gettop(s1);
s1=pop(s1);
s2=push(s2,y);
}
else
{
f=0;
y=gettop(s1);
s1=pop(s1);
cout<<"停车场中有编号为"<<x.num<<"车"<<endl;
cout<<"该车将离开,应收停车费:"<<(x.arrtime-y.arrtime)*M<<"元"<<endl;
while(!empty(s2))
{
y=gettop(s2);
s2=pop(s2);
s1=push(s1,y);
}
//?停车场中离开一辆车后,便道上第一辆车进入停车场if(!emptyqueue(q))
{
y=gethead(q); //取对头元素
q=dlqueue(q); //出队
s1=push(s1,y); //进栈
}
}
if(empty(s1)) //停车场中无给定的车辆,则到便道上找
{
while(!empty(s2))
{
y=gettop(s2);
s2=pop(s2);
s1=push(s1,y);
}
if(!emptyqueue(q))
{
link *p=q.front;
while((p!=NULL)&&(p->data.num!=x.num))
{
r=p;
p=p->next;
}
if(p!=NULL)
{
cout<<"便道上有编号为"<<x.num<<"的车辆"<<endl;
cout<<"该车将离开,应收停车费0.00元:"<<endl;
r->next=p->next;
delete p;
}
else
cout<<"便道上没有编号为"<<x.num<<"的车辆,输入的车辆不存在!!!"<<endl;
}
}
}
void pr1() //输入便道中的车辆编号和到达时间
{
int t=s1.top;
cout<<"输入便道中的车辆编号和到达时间"<<endl;
while(t!=0)
{
cout<<s1.stack[t].num<<" "<<s1.stack[t].arrtime<<endl;
t--;
}
cout<<endl;
}
void pr2() //输出便道中的车辆编号和到达时间
{
link *p=q.front->next;
cout<<"输出便道中的车辆编号和到达时间"<<endl;
while(p!=NULL)
{
cout<<p->data.num<<" "<<p->data.arrtime<<endl;
p=p->next;
}
cout<<endl;
}
void main()
{
int n;
elemtype x;
s1=inistack(s1);
s2=inistack(s2);
q=iniqueue(q);
while(1)
{cout<<endl;
cout<<"请输入车辆编号,到达时间或离开时间"<<endl;
cin>>x.num>>x.arrtime;
cout<<"请输入处理车辆的代号(1 到达2 离开3 结束)";
cin>>n;
if(n==1){arrive(x);pr1();pr2();}
else if (n==2){delive(x);pr1();pr2();}
else break;
}
cout<<endl;
}
五、实验小结。

相关文档
最新文档