实验四 停车场管理
设停车场内只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入停车场的车辆必须先退出车场为它让路,待该辆车开出大门外后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。试设计一个停车管理程序。
分析:汽车在停车场内进出是按照栈的运算方式来实现的,先到的先进停车场;停车场的汽车离开停车场时,车场内其他汽车为该辆汽车让路,也是按栈的方式进行;汽车在便道上等候是按队列的方式进行的。因此,将停车场设计成一个栈,汽车让路也需要另一个栈来协助完成,汽车进出便道用队列来实现。
算法描述:
1、接受命令(A:入,D:出)和车号,若是汽车要进停车场,先判断停车场栈是否满,若不满,则汽车入栈,否则汽车入便道队列等候。
2、若是汽车要离开停车场,为该汽车让路,将停车场栈上若干辆汽车入临时栈,等这辆汽车出停车场后,临时栈中的汽车出栈,再回到停车场栈,然后看便道队列是否为空,若不空,则说明有汽车等候,从队头取出汽车号,让该车入停车场栈。
3、重复1、2直到为退出命令。
呃。。。完全是模拟题嘛。。。
开始写的时候想的是用STL,到了最后发现,按老师的样例,每次操作之后要输出当前车库和当前过道的情况,这样的话在保证栈不被破坏的情况下得到元素就只好复制了,而STL中的 stack 和 queue 没有这个功能,所以,所以这个栈还是得自己老老实实地写,但是之前写的又懒得丢掉了,于是按着那种写法(q.pop()那种)哈哈,顺道用C++类封装起来用,也不错哈~
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class stack
{
private:
int Top;
long a[10];
public:
stack()
{
Top=0;
memset(a,0,sizeof(a));
}
void pop()
{
Top--;
}
void push(long no)
{
a[++Top]=no;
}
int top()
{
return a[Top];
}
int size()
{
return Top;
}
bool empty()
{
return Top;
}
void copy(stack p)
{
Top=p.size();
for(int i=1;i<=Top;i++)
a[i]=p.a[i];
}
void wu()
{
for(int i=1;i<=Top;i++)
printf("%8ld",a[i]);
}
};
stack p,l;
class queue
{
private:
int num;
long a[10];
public:
queue()
{
num=0;
memset(a,0,sizeof(a));
}
void push(long no)
{
a[++num]=no;
}
void pop()
{
for(int i=2;i<=num;i++)
a[i-1]=a[i];
num--;
}
int size()
{
return num;
}
int front()
{
return a[1];
}
void copy(queue q)
{
num=q.size();
for(int i=1;i<=num;i++)
a[i]=q.a[i];
}
void wu()
{
for(int i=1;i<=num;i++)
printf("%8ld",a[i]);
}
};
queue q;
int search_in_stack(long no);
int search_in_queue(long no);
void miao();
int main()
{
while(1)
{
printf("按照要求输入指令:\n");
printf("\t命令 A 表示:入\n");
printf("\t命令 D 表示:进\n");
printf("\t命令 Q 表示:退出\n");
char s[10];
scanf("%s",s);
if(s[0]=='Q')
break;
long no;
scanf("%ld",&no);
if(s[0]=='A')
{
if(p.size()==5)
{
if(q.size()==8)
{
printf("\t*********************************\n");
printf("\t* *\n");
printf("\t* 过道已满! *\n");
printf("\t* *\n");
printf("\t*********************************\n\n");
}
else
{
q.push(no);
}
}
else
{
p.push(no);
}
}
else if(s[0]=='D')
{
if(p.size()==0)
{
printf("已空!\n");
}
else{
if(search_in_stack(no))
{
while(no!=p.top())
{
long noo=p.top();
p.pop();
l.push(noo);
}
p.pop();
while(l.size())
{
long noo=l.top();
l.pop();
p.push(noo);
}
if(q.size())
{
long no=q.front();
q.pop();
p.push(no);
}
}
else if(search_in_queue(no))
{
printf("************************************\n");
printf("* 您的车正在排队中,暂时不能离开!*\n");
printf("************************************\n");
}
else
q.pop();
}}
miao();
}
return 0;
}
void miao()
{
printf("停车场:\n");
printf("------------------------------------------\n");
printf("|\n");
printf("|");
p.wu();
printf("\n");
printf("|\n");
printf("------------------------------------------\n\n\n");
printf("过道:\n");
printf("-----------------------------------------------------------------\n");
printf("\n");
printf(" ");
q.wu();
printf("\n");
printf("\n");
printf("-----------------------------------------------------------------\n\n\n\n");
return ;
}
int search_in_stack(long no)
{
stack pp(p);
while(pp.size())
{
if(no==pp.top())
return 1;
pp.pop();
}
return 0;
}
int search_in_queue(long no)
{
queue qq(q);
if(no==q.front())
return 0;
while(qq.size())
{
if(no==qq.front())
return 1;
qq.pop();
}
return 0;
}