设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。
试为停车场编制按上述要求进行管理的模拟程序。 以栈模拟停车场,
以下是代码过程:
#include<iostream>
#include<string>
using namespace std;
int x, y = 0;
//定义汽车的信息
typedef struct
{
int in_time;
int out_time;
char ming[2000];
}car;
//定义栈的结构
typedef struct
{
car *base;
car *top;
int stacksize;
}Sqstack;
//定义队列的链表结构
typedef struct
{
car *front;
car *rear;
}Queue;
//初始化栈
void initstack(Sqstack &s,int n)
{
s.base = new car[n];
s.top = s.base;
s.stacksize = n;
}
//初始化队列
void initQueue(Queue &q)
{
q.front = q.rear = new car[5000];
}
//判断栈是否为空
bool StackEmpty(Sqstack s)
{
if (s.base == s.top)return false;
else return true;
}
//进栈
void PushStack0(Sqstack &s, car p)
{
*s.top = p;
s.top++;
}
//出栈
car Pop(Sqstack &s)
{
s.top--;
return *s.top;
}
//出队列
car Pop(Queue &q)
{
return *q.front++;
}
//进停车场
void inpark(Sqstack &s,Queue &q,car n)
{
if ((s.top - s.base) < s.stacksize)
{
x++;
*s.top= n;
s.top++;
cout << "Stack" <<" " << x << endl;
}
else
{
y++;
*q.rear = n;
q.rear++;
cout << "Queue" <<" "<< y<<endl;
}
}
//出停车场
void outpark(Sqstack &s, Sqstack &L,Queue &q, car *e,car*r)
{
int i;
for (i = 0;i <= x;i++)
{
if (strcmp(e->ming, r->ming) == 0)
{
break;
r++;
}
if (i <= x)
{
while (1)
{
car d;
d = Pop(s);
cout << d.ming << ":out" << " ";
if (strcmp(r->ming, s.top->ming) == 0)
break;
PushStack0(L, d);
}
int a = (e->out_time) - (s.top->in_time);
if (1)
{
while (StackEmpty(L))
{
*s.top = Pop(L);
cout << s.top->ming << ":in" << " ";
s.top++;
}
if (q.front != q.rear)
{
*s.top = Pop(q);
s.top->in_time = e->out_time;
cout << s.top->ming << ":in" << " ";
s.top++;
y--;
}
else
x--;
}
cout << a << endl;
}
else
{
cout << "0" << endl;
y--;
q.front++;
}
}
}
int main()
{
int n,m,ming;
char k[20];
char w[20];
Sqstack s,L;
car c;
Queue q;
cin >> n;
initstack(s,n);
initstack(L, n);
initQueue(q);
cin >> m;
for (int i = 0;i < m;i++)
{
cin >> k;
if (strcmp(k, "arrive") == 0)
{
cin >> c.ming >> c.in_time;
inpark(s, q, c);
}
if (strcmp(k, "leave") == 0)
{
car *e;
e = new car;
car *r;
r = new car;
r = s.base;
cin >> e->ming >> e->out_time;
outpark(s, L,q, e,r);
}
}
return 0;
}