(对于这个程序最关键的是出停车场的模块,在这个程序之中,必须要建立一个链队列和一个停车栈一个备用栈,备用栈在出车时会被调用到。
一、问题描述
停车场管理软件的主要标是实现停车场用户借助停车场管理软件实现对停车位进行管理和监控。可以实现空闲车位查询、占用车位查询、已停车辆和用户进行管理、以及消费管理。为用户提供强大的数据操纵功能,界面友好、使用简单方便,能够满足用户的基本要求。
停车场管理系统主要涉及到用户、车位、车辆、以及消费等几个要点。管理员可以查询车位及停放车辆,并出入的车辆进行计费及收费管理。
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。为停车场编制按上述要求进行管理的模拟程序。
二、基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“‘离去”的信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若车辆到达,则输出汽车在停车场内或便道上的停车位置;若车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构,队列以链表结构。
三、实现提示
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据接到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项。汽车的牌照号码和进入停车场的时刻。
四.测试数据
设n=2,输入数据为:('A',1,5),('A',2,10),('D',1,15),('A',3,20),('A',4,25),('A',5,30),('D',2,35),('D',4,40),('E',0,0)。其中:'A'表示到达;'D'表示离去(Departure);'E'表示输入结束(End)。
五、选做内容
完成图形化界面设计。
// 停车场管理系统
#include"stdio.h"
#include"stdlib.h"
#define OVERFLOW 0
#define STACKSIZE 2 // 车库容量
typedef struct time // 时间节点
{
int hour;
int min;
}Time;
typedef struct // 车辆信息
{
char CarNum;
float time;
int pos_a; // 车在停车场中的位置
int pos_b; // 车在便道上的位置
int flag;
}Car,Car2;
typedef struct // 车库信息 (顺序栈)
{
Car *top;
Car *base;
int stacksize;
}SqStack;
int InitStack(SqStack *&S) // 栈的初始化
{
Car *Car1;
Car1=(Car*)malloc(sizeof(Car));
S=(SqStack*)malloc(sizeof(SqStack));
S->base= Car1;
if(!S->base)
exit(0);
S->top=S->base;
S->stacksize=STACKSIZE;
return 1;
}
int StackEmpty(SqStack *S) //栈是否为空
{
if(S->top==S->base)
return 1;
else
return 0;
}
int StackFull(SqStack *S) //栈是否满
{
if(S->top-S->base>=S->stacksize)
return 1;
else
return 0;
}
int Push(SqStack *&S,Car e) // 入栈
{
if(S->top-S->base==S->stacksize)
return 0;
*S->top++=e;
return 1;
}
int Pop(SqStack *&S,Car &e) // 出栈
{
if(S->top==S->base)
return 0;
e=*--S->top;
return 1;
}
int StackTraverse(SqStack *S) // 遍历栈
{
Car *p=S->top;
Car *q=S->base;
int l=1;
if(StackEmpty(S))
{
for(int j=1;j<=STACKSIZE;j++)
{
printf("\t 车牌: 无 ");
printf("\t\t 到达时间: 无 ");
printf("\t 位置 %d : 空闲 ",j);
printf("\n");
}
return 1;
}
while(p!=q)
{
Car car=*(q);
printf("\t 车牌 : %d",car.CarNum);
printf("\t\t 到达时间: %5.2f",car.time);
printf("\t\t 位置: %d",l++);
printf("\n");
q++;
}
return 1;
}
typedef struct // 备用车道 (顺序栈)
{
Car2 *top2;
Car2 *base2;
int stacksize2;
}SqStack2;
int InitStack2(SqStack2 *&S2) // 初始化
{
Car *Car2;
Car2=(Car*)malloc(sizeof(Car));
S2=(SqStack2*)malloc(sizeof(SqStack2));
S2->base2= Car2;
if(!S2->base2)
exit(0);
S2->top2=S2->base2;
S2->stacksize2=STACKSIZE;
return 1;
}
int StackEmpty2(SqStack2 *S2) // 判空
{
if(S2->top2==S2->base2)
return 1;
else
return 0;
}
int Push2(SqStack2 *&S2,Car2 e2) // 进栈
{
if(S2->top2-S2->base2==STACKSIZE)
return 0;
*S2->top2++=e2;
return 1;
}
int Pop2(SqStack2 *&S2,Car2 &e2) // 出栈
{
if(S2->top2==S2->base2)
return 0;
e2=*--S2->top2;
return 1;
}
typedef struct QNode // 车道信息(链队)
{
Car data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue *&Q) // 初始化
{
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
Q->front=Q->rear=(QNode*)malloc(sizeof(QNode));
Q->front->next=NULL;
return 1;
}
int EnQueue(LinkQueue *Q,Car e) // 进队
{
QueuePtr p;
p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return 1;
}
int QueueEmpty(LinkQueue Q) // 判空
{
if(Q.front==Q.rear)
return 1;
else
return 0;
}
int DeQueue(LinkQueue &Q,Car &e) //出队
{
QueuePtr p;
if(Q.front==Q.rear)
return 0;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
delete p;
return 1;
}
int main()
{
int i=1,j=1;
int status;
float time,money;
system("color 37");
LinkQueue *Q;
Car car_I,car_D,car_M;
SqStack *S;
SqStack2 *S2;
InitStack(S);
InitStack2(S2);
InitQueue(Q);
while(1)
{
printf("\t\t\t 欢迎来到 XXXXXX 停车场! \n");
printf("*****************************************************************\n");
printf("\t\t\t1-- 车辆到达停车场 \n");
printf("\t\t\t2-- 车辆离开停车场 \n");
printf("\t\t\t3-- 停车场存放车辆情况 \n");
printf("\t\t\t0-- 退出程序 \n");
printf("*****************************************************************\n");
printf(" 请选择所需要的操作 (0-3):\n");
scanf("%d",&status) ;
if(status==1)
{
printf("\t 请输入车牌号: ");
scanf("%d",&car_I.CarNum);
printf("\t 请输入车到达的时间: ");
scanf("%f",&car_I.time);
if(!StackFull(S))
{
Push(S,car_I); // 车进入车库
car_I.pos_a=i;
car_I.flag=1;
i=i+1;
for(int m=1;m<50;m++)
// 边线
printf("--");
printf("\n");
printf("\t 车牌号: ");
printf("%d",car_I.CarNum);
printf("\t 到达时间: ");
printf("%5.1f\t",car_I.time);
printf("\t 车库中的位置是: %d\n",car_I.pos_a);
for(int m=1;m<50;m++)
// 边线
printf("--");
printf("\n");
printf("\n");
printf("\n");
}
else
{
EnQueue(Q,car_I);
car_I.pos_b=j;
car_I.flag=0;
++j;
printf("\n");
printf("\tSorry! 车库已满!!!,您可以把车停在车道上! \n");
printf("\n");
for(int m=1;m<50;m++) // 边线
printf("..");
printf("\n");
printf("\t 车牌号: ");
printf("%d",car_I.CarNum);
printf("\t 便道上的位置为: %d\n",car_I.pos_b);
for(int m=1;m<50;m++) // 边线
printf("..");
printf("\n");
printf("\n");
printf("\n");
}
system("pause");
system("cls");
}
else if(status==2)
{
// 指令为 2 , 开车离去(如果车在车库里收取停车费;在便道上则免费)
printf(" 请输入车主的车牌号: ");
scanf("%d",&car_D.CarNum);
printf(" 请输入出场时间: ");
scanf("%f",&car_D.time);
i=i-1;
int flag=0;
// 判断车是否在便道上
if(StackFull(S))
{
Car *p=S->top;
Car *q=S->base;
while(p!=q)
{
Car car=*(q);
if(car.CarNum!=car_D.CarNum)
{
flag++;
}
if(car.CarNum==car_D.CarNum)
{
goto loop;
}
q++;
}
if(flag>=STACKSIZE)
{
printf(" 您的车停在便道上 ");
}
printf("\n");
printf("\n");
printf("\n");
}
else
{
loop:do
{ // 挡在前面的车给要出去的车让路
Pop(S,car_M);
// 加一个判断,判断是不是停车场里的车
if(car_D.CarNum!=car_M.CarNum)
{
Push2(S2,car_M);
}
else
{
car_I.time=car_M.time;
}
}
while(car_D.CarNum!=car_M.CarNum);
while(!StackEmpty2(S2))
{
// 让路的车返回去
Pop2(S2,car_M);
Push(S,car_M);
}
while(!QueueEmpty(*Q)&&!StackFull(S))
{
if(!StackFull(S))
{
DeQueue(*Q,car_M); // 便道上的车离开后进入停车场,那么后面的车的位置都得变。
car_M.flag=1;
}
Push(S,car_M);
printf(" 车牌为 %d 的车离开车库,车道上车牌为 %d 的车进入车库 \n",car_D.CarNum,car_M.CarNum);
}
time=car_D.time-car_I.time;
if(time<0.0)
{
printf(" 输入时间有错!请重新输入! ");
}
if(time>0.0&&time<=3.0)
{
money=time*4;
}
else money=time*6;
printf(" 你的车牌为 %d 的车,应收费 %5.2f 元。 ",car_D.CarNum,money);
printf(" 欢迎下次光临我们的车库 \n");
}
printf("\n");
printf("\n");
printf("\n");
system("pause");
system("cls");
}
else if(status==3)
{ // 指令为 3 ;查看车库停车情况;
StackTraverse(S);
system("pause");
system("cls");
}
else if(status!=1&&status!=2&&status!=3&&status!=0)
{
printf("\t 指令错误 !!! 请在下面重新输入: ");
system("pause");
system("cls");
}
else if(status==0)
break;
}
}