#include<iostream.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define MaxSize 1
typedef struct
{
int carnumber; //汽车牌号
int time; //汽车到达或离开的时间
}carInfo; //汽车有关信息
typedef struct
{
carInfo *top; //栈顶指针
carInfo *base; //栈底指针
int stacksize;
}SeqStack; //模拟车站的顺序栈
typedef struct Qnode
{
int carnumber;
int time;
struct Qnode *next;
}QNode,*QueuePark; //临时顺序栈模拟车辆规避所
typedef struct
{
QueuePark front; //队头指针
QueuePark rear; //队尾指针
int lenth;
}LinkQueue; //模拟便道
void InitStack(SeqStack *s)
{
s->base=(carInfo *)malloc(MaxSize*sizeof(carInfo));
if(!s->base)
exit(OVERFLOW);
s->top=s->base;
s->stacksize=0;
} //栈的初始化
void Push(SeqStack *s,carInfo e)
{
*s->top++=e; //栈顶指针值加1,将e入栈
s->stacksize++;
}
carInfo Pop(SeqStack *s)
{
carInfo e;
if(s->top==s->base)
{
cout<<"\t\t 停车场内没有该车辆!"<<endl; //若栈为空,则输出提示信息,退出。
exit(0) ;
}
e=*--s->top; //若栈不为空,则删除s的栈顶元素,用e返回其值,栈顶指针减1
s->stacksize--; //栈长度减1
return e;
}
int InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePark)malloc(sizeof(QNode));
if(!Q->front)
exit(OVERFLOW);
Q->front->next=NULL;
Q->lenth=0;
return OK;
} //初始化队列(便道)
void InsertQueue(LinkQueue *Q,carInfo *a )
{ //插入c车辆到新的队尾(插入到便道上)
QueuePark p;
p=(QueuePark)malloc(sizeof(QNode)); //申请内存空间
if(!p)
exit(OVERFLOW); //申请失败退出
p->carnumber=a->carnumber; //把新车辆的信息存放到新申请的内存空间中去
p->time=a->time;
p->next=NULL;
Q->rear->next=p; //p插入到队尾
Q->rear=p; //队尾指针后移
Q->lenth++; //队长度加1
}
QueuePark DeleteQueue(LinkQueue *Q)
{
QueuePark p,e,s={0};
if(Q->front==Q->rear)
{
cout<<"\t\t 便道上没有车辆!"<<endl; //若便道上没有车辆,则输入提示
return s;
}
p=Q->front->next; //p指向队头指针的下一个存储空间
e=p; //用e返回其值
Q->front->next=p->next; //Q指针后移
Q->lenth--; // 队列长度减1
if(Q->rear==p)
Q->front=Q->rear; //保存队尾指针
return e;
}
void arrive(SeqStack *s,LinkQueue *p,carInfo a,int n)
{
if(s->stacksize<n)
{
Push(s,a); //n代表用户确定栈的大小 ,若栈中未满,则将车辆进入栈(停车场)中,同时显示出车辆位于栈中的位子
cout<<"\n\t\t 车牌号为"<<a.carnumber<<"的车辆进入停车场"<<s->stacksize<<"号车道"<<endl;
}
else
{
InsertQueue(p,&a); //若队列已满,则车辆进入队列(便道)中,同时显示位于队列(便道)中的位子
cout<<"\n\t\t 停车场已满,车牌号为"<<a.carnumber<<"的车辆停在便道的"<<p->lenth <<"号位置"<<endl;
}
}
void leave(SeqStack *tcc,SeqStack *dcc,LinkQueue *p,carInfo a,float pay)
{
carInfo x,ss;
QueuePark b;
int find=1,arrivetime=0;
float cost=0.0;
while(find)
{
ss=Pop(tcc); //将停车场中的tcc车从车站中出栈
Push(dcc,ss);
if(ss.carnumber==a.carnumber) //若要离开的车辆在车站中则算出它一共停留的时间,并计算出它的停车费
{
find=0;
cost=(a.time-ss.time)*pay;
arrivetime=ss.time;
}
}
Pop(dcc); //把临时堆栈的第一辆车(要离开的)去掉;
while(dcc->stacksize)
{
x=Pop(dcc); //将临时栈中的第一辆车的信息存入x中
Push(tcc,x); //再将x依次放入栈中(停车场)
}
if(tcc->stacksize<50&&p->lenth!=0)
{
b=DeleteQueue(p); //将队列首位从队列中删除,放入b中
x.carnumber=b->carnumber; //将b的信息赋予x
x.time=b->time;
Push(tcc,x); //再将x入栈,并显示哪个车辆是由便道进入停车场的几号通道的
cout<<"\n\t\t 车牌号为"<<x.carnumber<<"的车辆由便道进入停车场"<<tcc->stacksize<<"号车道\n\n";
}
//显示车辆在车站中停留的相关信息
cout<<"\t\t"<<"*****************************************************\n";
cout<<"\t\t"<<"** |车牌号码|进站时刻|出站时刻|停留时间|停车费用| **\n";
cout<<"\t\t"<<"** ---------------------------------------------- **\n";
cout<<"\t\t "<<" "<<a.carnumber<<" | "<<arrivetime<<" | "<<a.time<<" | "<<a.time-arrivetime<<" | "<<cost<<" | "<<endl;
cout<<"\t\t"<<"*****************************************************\n";
}
void draw()
{
//显示符号图画
cout<<"\t ,·′ ,,·′`) \n";
cout<<"\t(,,·′ (,*¤ 欢迎使用模拟停车场管理系统 ¤〃′`) \n";
cout<<"\t ,·′ ,,·′`) \n";
cout<<"\t\t 制作人:计科05级1班 段伟 \n";
//显示车辆输入信息说明
cout<<"\n\t |******************************************************|";
cout<<"\n\t |*********** 模拟停车场管理系统 ***********|";
cout<<"\n\t |*****--------------------------------------------*****|";
cout<<"\n\t |***** 车辆信息输入说明: *****|";
cout<<"\n\t |***** *****|";
cout<<"\n\t |***** (A/a 1 2): 车牌号1的车5时刻到达 *****|";
cout<<"\n\t |***** *****|";
cout<<"\n\t |***** (D/d 1 8): 车牌号1的车8时刻离开 *****|";
cout<<"\n\t |***** *****|";
cout<<"\n\t |***** (E/e 0 0): 退出系统 *****|";
cout<<"\n\t |*****--------------------------------------------*****|";
cout<<"\n\t |***** 此模拟停车场的初始化车位总个数为:3个车位 *****|";
cout<<"\n\t |*****--------------------------------------------*****|";
cout<<"\n\t |***** 此停车场对每辆车的收费标准为:2.0元/小时 *****|";
cout<<"\n\t |*****--------------------------------------------*****|";
cout<<"\n\t |***** 温馨提示:请按照提示进行操作! *****|";
cout<<"\n\t |******************************************************|";
}
void main()
{
SeqStack tcc,dcc; //声明两个顺序栈,一个模拟停车场,另一个模拟车辆规避所
LinkQueue p; //声明一个队列,模拟便道
carInfo a; //车辆信息对象
int sum=1000,n=3; //n是停车场的车位总数, sum是模拟汽车信息输入的次数
float pay=2.0; //单位时间内的停车费
char sign,c; //sign对系统的操作方式,c为是否对车位总数及收费标准进行修改
draw(); //显示主界面
InitStack(&tcc); //初始化顺序栈(模拟停车场)
InitStack(&dcc); //初始化顺序栈(车辆规避所)
InitQueue(&p); //初始化队列(便道)
cout<<"\n\n 你是否想更改停车场的车位总个数及对每辆车的单位时间内的收费标准(Y/N):";
c=cin.get();
if(c=='Y'||c=='y')
{
cout<<"\n\n\t 请先输入模拟停车场的车位总个数:";
cin>>n;
cout<<"\n\t 请输入此停车场的对每辆车的收费标准(元/小时):";
cin>>pay;
}
cout<<"\n\t 请输入A/D/E,车牌号,时刻(输入格式如:A/a 1 5):";
cin>>sign>>a.carnumber>>a.time;
while(sum)
{
switch(sign)
{
case 'a':
case 'A':arrive(&tcc,&p,a,n);break;
case 'D':
case 'd':leave(&tcc,&dcc,&p,a,pay);break;
case 'e':
case 'E':exit(OVERFLOW);break;
}
cout<<"\n\t 请输入A/D/E,车牌号,时刻(输入格式如:A/a 1 5):";
cin>>sign>>a.carnumber>>a.time;
sum--;
}
}