【实验目的】
(1) 深入了解栈和队列的特性,掌握栈和队列的存储方法。
(2) 掌握栈和队列的基本操作,如初始化、入栈(队列)、出栈(队列)等,并能在实际问题背景下灵活运用。
【问题描述】
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已经停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出场为它让路,待该辆车开出大门外,其他车辆再按次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,试为停车场编制按上述要求进行管理的模拟程序。
#define sz 10
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct {//让车道 顺序栈
int a[2];
int top;
}rang;
void initr(rang &r){//初始化
r.top=0;
}
void rpush(rang &r,int e){//进栈
r.a[r.top]=e;r.top++;
}
void rpop(rang &r,int &e){//出栈
e=r.a[r.top-1];
r.top--;
}
typedef struct{//等候车道 循环队列
int base [sz];
int front;
int rear;
}deng;
void initq(deng &d){//初始化队列
d.front=d.rear=0;
}
void enq(deng &d,int e){//进队
if((d.rear+1)%sz==d.front)
cout<<"等候车道已满"<<endl;
else
{
d.base[d.rear]=e;
d.rear=(d.rear+1)%sz;
cout<<e<<"号车辆进入等候车道"<<endl;
}
}
void deq(deng &d,int e){//出队列
if(d.front==d.rear)
cout<<"等候车道无车"<<endl;
else
{
e=d.base[d.front];
cout<<e<<"号车辆离开等候车道"<<endl;
d.base[d.front]=0;
d.front=(d.front+1)%sz;
}
}
typedef struct{//停车场
int b[3];
int top;
}ting;
void inits(ting &t){//初始化停车场
t.top=0;t.b[t.top]=0;
}
void push(ting &t,deng &d,int e){//进入停车场
if(t.top==3)
{
cout<<"停车场已满,进入等候车道"<<endl;
enq(d,e);
}
else
{
t.b[t.top]=e;
t.top+=1;
cout<<e<<"号车辆进入停车场"<<endl;
}
}
void pop(ting &t,rang &r,int &e){//出停车场
e=t.b[t.top-1];
t.top--;
}
typedef struct{
char xx;
int bh;
int time;
}che;
int main()
{
int charge;
cout<<"停车场管理系统"<<endl<<"请输入收费标准:"<<endl;cin>>charge;
cout<<"请输入车辆信息:"<<endl;
ting t;//创建停车场,等候车道,让行车道
deng d;
rang r;
inits(t);//初始化停车场,等候车道,让行车道
initq(d);
initr(r);
che c[sz];
for(int i=0;i<sz;i++){
cout<<"请输入车辆到达离去信息(A为到达车辆,D为离开车辆,E退出):"<<endl;
cin>>c[i].xx;
if(c[i].xx=='E'){cout<<"退出使用停车场管理系统"<<endl;break;}
cout<<"请输入车辆编号:"<<endl;
cin>>c[i].bh;
cout<<"请输入车辆到达/离去时间:"<<endl;
cin>>c[i].time;
if(c[i].xx=='A')
{
push(t,d,c[i].bh);
}
if(c[i].xx=='D')
{
int ist=1;//标记是否进入停车场
for(int h=0;h<3;h++) {if(b.[h]==c[i].bh)ist=0}//寻找车是否在停车场
if(ist=0;)
{
deq(d,c[i].bh);
cout<<"该车辆未进入停车场,收费为0"<<endl;
}
if(ist==1)
{
int l=1;
while(t.b[t.top-1]!=c[i].bh)
{
pop(t,r,l);
rpush(r,l);
cout<<l<<"号车进入让车道"<<endl;
}
pop(t,r,l);
cout<<c[i].bh<<"号车辆驶出停车场"<<endl;
while(r.top!=0)
{
rpop(r,l);
push(t,d,l);
}
int ch;//收费
for(int k=0;k<i;k++){if(c[k].bh==c[i].bh)break;}
ch=charge*(c[i].time-c[k].time);
cout<<"收费为 "<<ch<<endl;
}
}
}
return 0;
}