#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
/*#define NULL 0*/
#define ERROR 0
#define NULL 0
#define OK 1
#define OVERFLOW 0
#define STACK_INIT_SIZE 2
/*****模块一:模拟停车场的堆栈的性质*****/
typedef struct
{
int number; //汽车车号
int ar_time; //汽车到达时间
}Car;
typedef struct
{
Car *base; //停车场的堆栈底
Car *top; //停车场的堆栈顶
int stacksize;
}SqStack;
/*****堆栈的基本操作*****/
unsigned InitStack(SqStack &L) //构造一个空栈
{
L.base=(Car*)malloc(STACK_INIT_SIZE*sizeof(Car));
if(!L.base) return ERROR;
L.top=L.base;
L.stacksize=STACK_INIT_SIZE;
return OK;
}
unsigned StackEmpty(SqStack L)
{
if(L.top==L.base)
return OK;
else
return ERROR;
}
unsigned StackFull(SqStack L)
{
if(L.top-L.base>=STACK_INIT_SIZE)
return OK;
else
return ERROR;
}
unsigned Push(SqStack &L,Car e) //把元素e压入L栈
{
if(L.top-L.base>=STACK_INIT_SIZE)
return OVERFLOW;
else
{
*L.top++=e;
L.stacksize++;
}
return OK;
}
void Pop(SqStack &L,Car &e) //把元素e弹出L栈
{
if(L.top==L.base)
{
printf("停车场为空!!\n\n");
}
e=*--L.top;
L.stacksize--;
}
/*****模块二:模拟便道的队列的性质****/
typedef struct QNode
{
int number; //汽车车号
int ar_time; //汽车到达时间
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front; //便道的队列的对头
QueuePtr rear; //便道的队列的队尾
int length;
}LinkQueue;
/****队列的基本操作****/
unsigned InitQueue(LinkQueue &q) //构造一个空队列
{
q.front=q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!q.front||!q.rear) return ERROR;
q.front->next=NULL;
q.length=0;
return OK;
}
unsigned EnQueue(LinkQueue &q,int number,int ar_time) //把元素插入队列(属性为number,ar_time)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) return ERROR;
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
q.rear->next=p;
q.rear=p;
q.length++;
return OK;
}
unsigned PopQueue(LinkQueue &q,QueuePtr &w) //让队列中元素进入栈(属性为number,ar_time)
{
QueuePtr p;
if(q.front==q.rear)
return NULL;
p=q.front->next;
w=p;
q.front->next=p->next;
q.length--;
if(q.rear==p)
q.front=q.rear;
return OK;
}
/*****模块三:对进入停车场的汽车的处理*****/
void JinRu(SqStack &st,LinkQueue &q)
{
int number,time_a;
printf("车牌为:");
scanf("%d",&number);
printf("进场的时刻:");
scanf("%d",&time_a);
if(st.stacksize<2)
{
Car e;
e.number=number;
e.ar_time=time_a;
Push(st,e);
printf("该车已进入停车场在%d 号车道\n\n",st.stacksize);
}
else
{
EnQueue(q,number,time_a);
printf("停车场已满,该车先停在便道的第%d个位置上\n",q.length);
}
}
/*****模块四:对离开的汽车的处理*****/
void Likai(SqStack &st,SqStack &sl,LinkQueue &q) //st堆栈为停车场,sl堆栈为倒车场,q为便道队列
{
int number,time_d,flag=1,money,arrivaltime;
printf("车牌为:");
scanf("%d",&number);
printf("出场的时刻:");
scanf("%d",&time_d);
Car e,q_to_s;
QueuePtr w;
while(flag) //找到要开出的车,并弹出停车场栈
{
Pop(st,e);
Push(sl,e);
if(e.number==number)
{
flag=0;
money=(time_d-e.ar_time)*2;
arrivaltime=e.ar_time;
}
}
Pop(sl,e); //把临时堆栈的第一辆车(要离开的)去掉;
while(sl.stacksize) //把倒车场的车倒回停车场
{
Pop(sl,e);
Push(st,e);
}
if(st.stacksize<2&&q.length!=0) //停车场有空位,便道上的车开进入停车场
{
PopQueue(q,w);
q_to_s.ar_time=time_d;
q_to_s.number=w->number;
Push(st,q_to_s);
printf("车牌%d的车已从通道进入停车场,所在的停车位为:\n\n",st.stacksize);
}
printf("收 据\n\n");
printf(" ----------------------- 车牌号: ",number);
printf("-----------------------------------------------------\n");
printf("|进车场时刻:%d | 出车场时刻:%d | 停留时间:%d | 应付%d元|\n",arrivaltime,time_d,time_d-arrivaltime,money);
printf("-----------------------------------------------------\n");
printf("| ARRIVALTIME |?\n");
printf("----------------------------------------------------\n\n");
}
/*****模块五:主函数****/
void main()
{
int m=100;
char flag; //进入或离开的标识;
SqStack sting,slinshi; //停车场和临时倒车场堆栈的定义;
LinkQueue line; //队列的定义;
InitStack(sting); //构造停车场堆栈sting
InitStack(slinshi); //构造倒车场堆栈slinshi
InitQueue(line); //构造便道队列line
while(m)
{
printf("\n ** 停车场管理程序 **\n");
printf("========================================\n");
printf("** **\n");
printf("** A --- 汽车 进 车场 D --- 汽车 出 车场 **\n");
printf("** **\n");
printf("** E --- 退出 程序 **\n");
printf("=========================================\n");
printf(" 请选择 :(A,D,E): ");
fflush(stdin);
scanf("%c",&flag);
switch(flag)
{
case 'A': JinRu(sting,line);break; //汽车进车场
case 'D': Likai(sting,slinshi,line);break; //汽车出车场
case 'E': exit(0);
}
m--;
}
}