/*停车场管理系统*/
#include
#include
#include
#include
#include
#include
/*顺序栈存储结构*/
#define stacksize 2 //停车场容量
typedef struct
{
char lisence[10];
int type;
clock_t reach;
clock_t leave;
int stop;
}carinfo;
typedef carinfo datatype;
typedef struct
{
datatype items[stacksize];
int top;
}sqstack;
/*初始化顺序栈*/
int initstack(sqstack*s)
{
s->top=-1;
return 1;
}
/*是否栈空*/
int stackempty(sqstack s)
{
if(s.top==-1)
return 1;
else
return 0;
}
/*入栈*/
int push(sqstack *s,datatype e)
{
if(s->top>=stacksize-1)
{
cout<<"堆栈已满,不能完成入栈操作!"<
}
s->top++;
s->items[s->top]=e;
return 1;
}
/*出栈*/
int pop(sqstack *s,datatype *e)
{
if(s->top<=-1)
{
cout<<"堆栈已空,不能完成出栈操作!"<
}
*e=s->items[s->top];
s->top--;
return 1;
}
/*链队列存储结构*/
typedef struct qnode
{
datatype data;
struct qnode *next;
}lqnode,*pqnode;
typedef struct
{
pqnode front,rear;
}linkqueue;
/*初始化链队列*/
int initqueue(linkqueue*q)
{
q->front=q->rear=(pqnode)malloc(sizeof(lqnode));
if(!q->front)
{
cout<<"初始化队失败!"<
}
q->front->next=NULL;
return 1;
}
/*是否栈空*/
int queueempty(linkqueue q)
{
if(q.front==q.rear)
return 1;
else
return 0;
}
/*入队*/
int enqueue(linkqueue*q,datatype e)
{
pqnode p;
p=(pqnode)malloc(sizeof(lqnode));
if(!p)
{
cout<<"内存分配失败,不能完成入对操作!"<
}
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
return 1;
}
/*出队*/
int dequeue(linkqueue*q,datatype*e)
{
pqnode p;
if(q->front==q->rear)
{
cout<<"队列已空,不能完成出队操作!"<
}
p=q->front->next;
*e=p->data;
q->front->next=p->next;
free(p);
if(q->rear==p)
q->rear=q->front;
return 1;
}
/*销毁队列*/
int destroyqueue(linkqueue*q)
{
while(q->front)
{
q->rear=q->front->next;
free(q->front);
q->front=q->rear;
}
return 1;
}
/*车辆到达停车场*/
int reach(sqstack*stop,linkqueue*pave)
{
datatype *car;
car=(datatype*)malloc(sizeof(datatype));
if(!car)
{
cout<<"车辆进入出错"<
}
flushall(); //清除所有缓冲区
cout<<"欢迎进入!请输入车牌号:"<
if(stop->top>=stacksize-1)/*停车场已满,车进入便道等待*/
{
cout<<"停车场已满,请进入便道等待"<
}
else
{
car->reach=time(NULL);/*获取系统时间*/
car->stop=stop->top+1;
push(stop,*car);
cout<<"请车辆进入第"<
return 1;
}
/*车辆离开*/
void leave(sqstack*park,sqstack*tmp,linkqueue*pave,double unitprice)
{
int locate;
datatype p,t;
if(!stackempty(*park)) //停车场内有车
{
cout<<"请输入离开车辆的停车位号(1—— "<
cin>>locate;
while(park->top>locate-1) //排在离开车辆之前的车辆进入临时栈
{
pop(park,&p);
push(tmp,p);
}
pop(park,&p);
p.leave=time(NULL); //清空历史时间
cout<<"——————离开车辆信息——————"<
cout.precision(6);
cout.setf(ios::fixed); //设置为小数位始终有 6 位,没有这个的话就会像上面那个代码那样固定的不是小数点后面的数字了。
cout<
{
pop(tmp,&p);
push(park,p);
}
//如果停车场不满,而便道上不空,则便道上的车辆进入停车场
if(!queueempty(*pave)&&park->top
dequeue(pave,&t);
cout<<"便道上的"<
t.stop=park->top+1;
push(park,t);
}
else
cout<<"便道上没有车"<
else
cout<<"停车场内没有车"<
//显示停车场信息
void disppark(sqstack *park)
{
int i;
if(stackempty(*park))//停车场内没有车辆
cout<<"停车场没有车辆";
else
{
cout<<"停车位 车牌号 到达时间"<
{
cout<<"第"< cout<
cout<<"时间:";
cout<
}
}
}
//显示等待车信息
void disppave(linkqueue*pave)
{
pqnode p;
p=pave->front->next;
if(queueempty(*pave))//便道上是否有等待的车辆
cout<<"没有等待的车辆"<
{
cout<<"以下车辆处于等待状态"<
{
puts(p->data.lisence);
p=p->next;
}
}
}
float modifyunitprice()
{
float price=0;
cout<<"请输入单价:";
cin>>price;
cout<<"OK"<
}
void main()
{
int i,n;
sqstack park,way;
linkqueue pavement;
int choice;
float unitprice=5; //单价
initstack(&park); //初始化停车场
initstack(&way); //初始化让路的临时栈
initqueue(&pavement); //初始化便道
do
{
cout<<" 停车场管理系统 "<
cin>>choice;
if(choice<0 && choice>4)
continue;
switch(choice)
{
case 1:cout<<"请输入一共几辆车:";
cin>>n;
for(i=1;i<=n;i++)
reach(&park,&pavement); //车辆到达停车场
break;
case 2:leave(&park,&way,&pavement,unitprice); //车辆离开
break;
case 3:disppark(&park); //显示停车场信息
break;
case 4:disppave(&pavement); //显示等待车辆信息
break;
case 5:unitprice=modifyunitprice(); //修改单价
break;
case 0:exit(0); //退出系统
default:break;
}
}
while(1);
}