#include <iostream>
#include<iomanip>
using namespace std;
#define maxsize 20
#define n 3 //停车场空间
#define fee 10 //一小时收费10元
//车辆的信息
struct car
{
char bb; //状态
int num; //车牌号
int time; //进(/出)时间
} ;
//停车场栈
typedef struct stack
{
struct car G[n];
int top;
}SqStack;
//临时让位车的信息
struct rangweicar
{
int num; //让位车的车牌号
int time; //让位车的时间状态
};
//临时停车场栈,让位时用来存储让位车
typedef struct stackk
{
struct rangweicar H[maxsize];
int topp;
}SqStackk;
//创建结点结构
typedef struct Node
{
int data;
Node *next;
}Node;
typedef struct linkqueue //作为便道存储车辆
{
Node *front, *rear; //创建队头与队尾结点
int geshu; //创建队列结点数据域
}LinkQueue;
//对到达车辆进行操作
void A_cars(SqStack *s,LinkQueue *q,struct car a) //栈,队列,车辆信息结构体
{
if(s->top != n-1) //停车场没有满,车辆进入
{
(s->top)++; //扩栈
(s->G[s->top]).bb = a.bb;
(s->G[s->top]).num = a.num;
(s->G[s->top]).time = a.time;
}
else
{
cout<<"停车场已满,车辆进入便道等待"<<endl; //将多余的车停进队列中等待
Node *t = new Node;
t->data = a.num; //将新来的车的车牌号复制给结点t,此时不计费
t->next = NULL;
q->rear->next = t; //将链表结点插入到队列的结尾
q->rear = t; //扩充队列,将队尾结点指向t
q->geshu++; //便道(队列)的长度+1
}
}
//车辆离开
int D_cars(SqStack *s,LinkQueue *q,struct car d)
{
int i,j,x,y;
Node *p; //创建辅助结点p
SqStackk *k;
if(d.num == (s->G[s->top]).num) //判断离开的车辆是否是最后进入停车场
{
x = d.time-(s->G[s->top]).time;
y = fee*x;
cout<<"停车时间为:"<<x<<"小时,"<<"停车费用为:"<<y<<"元"<<endl;
if(q->geshu == 0)
{
cout<<"便道为空"<<endl;
(s->top)--; //如果便道为空,栈顶下移
return 0;
}
else //便道不为空,便道中的车辆进入栈
{
p = q->front->next;
q->front->next = p->next;
(s->G[s->top]).num = p->data; //便道进来的车位栈顶
(s->G[s->top]).time = d.time; //进入栈的时间为上一辆车离开的时间并开始计费
delete p; //删除辅助结点p
q->geshu--; //便道(队列)的长度-1
if(q->front->next == NULL) //判断便道(队列)是否为空
{
q->rear = q->front;
return 1;
}
}
}
else //离开的车辆不是最后进入停车场的车
{
for(i = 0; i<(s->top); i++)
{
if((s->G[i]).num != d.num)
continue;
else
break; //找到该离开的车的进入次序
}
if(i>= (s->top)) //在停车场中没有找到该车
{
cout<<"error"<<endl;
return -1;
}
x = d.time-(s->G[i]).time;
y = fee*x;
cout<<"停车时间:"<<x<<"小时,"<<"停车费用:"<<y<<"元"<<endl;
k = (SqStackk*)malloc(sizeof(SqStackk));
k->topp = -1;
for(j = (s->top);j<i;j--)
{
k->topp++;
(k->H[k->topp]).num = (s->G[j]).num;
(k->H[k->topp]).time = (s->G[j]).time;
s->top--;
}
s->top--; //车辆离开
while(k->topp>=0)
{
s->top++;
(s->G[s->top]).bb = 'A';
(s->G[s->top]).num = (k->H[k->topp]).num;
(s->G[s->top]).time = (k->H[k->topp]).time;
k->topp--;
}
if(q->geshu == 0)
{
cout<<"此时便道为空"<<endl;
return 2;
}
else
{
s->top++;
p = q->front->next;
q->front->next = p->next;
(s->G[s->top]).num = p->data;
(s->G[s->top]).time = d.time;
delete p;
q->geshu--;
if(q->front->next == NULL)
q->rear = q->front;
return 3;
}
}
}
//判断车辆状态并执行相关操作
void Judge_Output(SqStack *s,LinkQueue *q,struct car r)
{
if((r).bb == 'e'||(r).bb == 'E')
cout<<"程序结束,再见!"<<endl;
else if((r).bb == 'p'||(r).bb == 'P')
cout<<"停车场车辆数:"<<(s->top)+1<<endl;
else if((r).bb == 'w'||(r).bb == 'W')
cout<<"便道中车辆数:"<<q->geshu<<endl;
else if((r).bb == 'a'||(r).bb == 'A')
A_cars(s,q,r);
else if((r).bb == 'd'||(r).bb == 'D')
D_cars(s,q,r);
else cout<<"error!"<<endl;
}
void main()
{
SqStack *s; //创建栈对象
LinkQueue *q; //创建队列对象
Node *p;
struct car aa[maxsize];
int i;
s = (SqStack*)malloc(sizeof(SqStack));
//分配一块不小于sizeof(sqstack)个字节的连续空间,并将这段空间的首地址显式转换为SqStack类型后赋予变量s。
s->top = -1; //-1是判断标准
q = (LinkQueue*)malloc(sizeof(LinkQueue));
p = new Node;
p->next = NULL;
q->front = q->rear= p;
q->geshu = 0;
cout <<"停车场管理系统"<<endl;
cout<<endl;
cout <<"注:A(a)车辆到达;D(d)车辆离开;P(p)停车场车辆总数;W(w)便道车辆总数;E(e)退出"<<endl;
cout<<endl;
for(i=0;i<maxsize;i++)
{
cout<<"请输入汽车的状态,车牌号和时间:"<<endl;
cin>> aa[i].bb >> aa[i].num >> aa[i].time;
Judge_Output(s, q, aa[i]); //判断输入的车辆状态并执行相关操作
cout<<endl;
if(aa[i].bb == 'E' || aa[i].bb == 'e')
break;
}
}
运行结果如下: