题目
设停车场(如下图1所示)内只有一个可停放几量汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已经停满几量汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某车辆要离开时,由于停车场是狭长的通道,在它之后开入车场的车辆必须先退出车场为它让路,待该车辆开出大门外后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。试设计一个停车场管理程序(这里只是一个假想的停车场管理,并不代表实际的停车场管理)。
分析:汽车在停车场内进出是按照栈的运算方式来实现的,先到的先进停车场;停车场的汽 车离开停车场时,汽车场内其它汽车为该辆汽车让路,也是按栈的方式进行;汽车在便道上等候是按队列的方式进行的。因此,将停车场设计成一个栈,汽车让路也需要另一个栈来协助完成,汽车进出便道用队列来实现。
本设计,栈采用顺序栈结构,队列用链式存储结构。
存储结构定义如下:
#define stacksize 10
typedef struct sqstack
{
int data[stacksize];
int top;
} SqStackTp;
typedef struct linked_queue
{
int data;
struct linked_queue * next;
}LqueueTp;
typedef struct
{
LqueueTp *front , *rear ;
} QueptrTp;
停车场管理的算法描述如下:
1)接受命令和车号,若是汽车要进停车场,先判断停车场栈是否满,若不满,则汽车入栈,否则汽车进入便道队列等候。
2)若是汽车要离开停车场,为给汽车让路,将停车场栈上若干辆汽车入临时栈,等这辆车出停车场后,临时栈中的汽车出栈,在回到停车场栈,然后看便道队列是否为空,若不空则说明有汽车等候,从队头取出汽车号,让该车进入停车场栈。
3)重复1),2)直到为退出命令(车号为0或负数)。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
typedef struct Queue
{
int data;
struct Queue *next;
} Queue,*Que;
int vis[N],top=0; //用栈表示停车场
Que Q; //表示等待序列
int length; //表示停车场容量
int cnt = 0; //表示当前停车场内有多少车辆
int rem = 0; //表示等待区车辆的数量
void enter(int num,Que &Q); //表示停车
void enterqueue(Que &Q,int num); //入队操作
void leave(int num,Que &Q); //表示离开
void leavevis(int num); //表示离开停车场的操作
int popqueue(Que &Q); //表示出队操作
int main()
{
Q=new Queue; //初始化等待区
char op;
int num;
cout<<"请输入停车场的容量 : ";
cin>>length;
cout<<endl;
while(1)
{
cout<<"T-停车,L-离开,其他字符-操作结束"<<endl;
cout<<"请输入操作和车辆编号 : ";
cin>>op>>num; //输入操作和车辆编号
if(op=='T') //停车
enter(num,Q);
else if(op=='L') //表示离开
leave(num,Q);
else //其他字符表示输入结束
break;
}
cout<<"操作结束"<<endl;
return 0;
}
int popqueue(Que &Q) //表示出队操作
{
int k=Q->next->data;
Que p=Q->next;
Q->next=p->next;
free(p);
rem--;
return k;
}
void leavevis(int num) //表示离开停车场的操作
{
int i;
for(i=1; i<=top; i++) //判断该车辆是否在停车场中
{
if(vis[i]==num) break;
}
for(int j=i; j<=top; j++) swap(vis[j],vis[j+1]);
top--;
cnt--;
//for(int i=1;i<=top;i++) cout<<vis[i]<<endl;
}
void leave(int num,Que &Q) //表示离开
{
int f=0;
for(int i=1; i<=top; i++) //判断该车辆是否在停车场中
{
if(vis[i]==num)
f=1;
}
if(f==1) //表示从停车场中离开
{
leavevis(num);
cout<<num<<"号车辆已经从停车场中离开!"<<endl<<endl;
if(Q->next==NULL) //判断有没有车辆在等待区
cout<<"当前等待区为空,没有车辆进入停车场"<<endl<<endl;
else //有车辆在等待区
{
int k=popqueue(Q);
vis[++top] = k;
cnt++;
cout<<k<<"号车辆已经进入停车场,当前还有"<<rem<<"辆车在等待区"<<endl<<endl;
}
}
else if(f==0) //表示从等待区中离开
{
Que p1=Q,p2=Q->next;
while(p2->data!=num&&p2->next!=NULL)
{
p2=p2->next;
p1=p1->next;
}
if(p2->data!=num) cout<<"当前车辆不存在!"<<endl<<endl;
else
{
p1->next=p2->next;
free(p2);
rem--;
cout<<num<<"号车辆已经从等待区离开,当前还有"<<rem<<"辆车在等待区"<<endl<<endl;
}
}
}
void enterqueue(Que &Q,int num) //入队操作
{
Que p=new Queue;
p->data=num;
Que k=Q;
while(k->next) k=k->next;
k->next=p;
p->next=NULL;
rem++;
}
void enter(int num,Que &Q) //表示停车
{
if(cnt<length)
{
vis[++top]=num;
cnt++;
cout<<num<<"号车辆已放入停车场中!当前有"<<cnt<<"辆车在停车场"<<endl<<endl;;
}
else
{
enterqueue(Q,num);
cout<<num;
cout<<"号车辆已经进入等待区,当前共有"<<rem<<"辆等待车辆"<<endl<<endl;;
}
}