二、停车场管理(栈和队列的应用)
[问题描述]
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
[实现提示]
以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。
3、 算法设计
算法思想
建立两个栈一个作为停车场,另一个作为临时栈,建立一个队列。使用栈和队列的配合使用,进行停车场的建立,栈以顺序存储结构实现,队列以链表结构实现。首先在栈空的时候,使车辆进栈,保存车辆的进栈信息,以及输入时间和代码,当栈的指针指向栈顶,及大于stack[MAX+1]时,那么以后的车就先进入便道,当停车场的车有离开的时候,那么在该车以后的车在p++的引导下,相继开出停车场并进入临时栈,当该车开出的时候,那么刚才出去的车在按照先前的次序依次进栈,再把先前停在便道上的车按次序进栈。定义栈的顺序存储结构和队列的链式存储结构,同时定义栈顶指针top和栈底指针base。然后初始化栈,同时定义在停车时的停车时间time和所需要的费用mony的关系当车进入的时候栈顶元素+1,在当车进来的时候在+1,直到空间不足,当车进来的时候显示停车场已经停满,要停到便道上,便道元素+1;当停车场的车出来一辆之后,便道上的车才能进入停车场,队列元素减1,栈元素加1。而离开的车辆则输出离开的时间,调用计费函数,进行停车费的计算。
流程图
int InitStack(StackCar *S) //初始化栈
int InitQueue(QueueCar *Q) //初始化队列
int Push(StackCar *S,CarNode *p) //进栈操作
int Pop(StackCar S,CarNode (&p)) //出栈操作
int EnQueue(QueueCar *Q,CarNode *p) //进队列操作
int DeQueue(QueueCar Q,CarNode (&q)) //出队列操作
void PriceCal(CarNode *p,int Location) //价格计算
void InCarPark(StackCar *Enter,QueueCar *Q) //进停车站
void OutCarPark(StackCar *Out,StackCar *Temp,QueueCar *Q)
void DisplayStack(StackCar *S) //显示停车站的停车情况
void DisplayQueue(QueueCar *Q) //显示便道的停车情况
int main() //主函数 对以上函数的进行调用执行
main主函数
车辆进入停车场的处理 车辆
void jinru(SqStack &S1,LinkQueue &Q) void likai(SqStack &S1,SqStack
(1)进栈Push (1)出栈Pop
(2)进队EnQueue (2)进栈Push
(3)出队DeQueue
(4)进队EnQueue
#include<iostream>
#include<iomanip>
#include<malloc.h>
using namespace std;
#define Max 3 //停车场容量
#define Price 0.10 //收费价格
#define ERROR -1
typedef struct
{
int hour;
int min;
}Time;
typedef struct Node
{
char num[20];
Time reach;
Time leave;
}CarNode;
typedef struct stackNode
{
CarNode *data[Max + 1];
int top;
}StackCar;
typedef struct LinkNode
{
CarNode *data;
struct LinkNode *next;
}QueueNode;
typedef struct
{
QueueNode *front;
QueueNode *rear;
}QueueCar;
int InitStack(StackCar *S)
{
S->top = 0;
return 0;
}
int InitQueue(QueueCar *Q)
{
Q->front = Q->rear = (QueueNode*)malloc(sizeof(QueueNode));
if (!Q->front)
exit(ERROR);
Q->front->next = NULL;
return 0;
}
int Push(StackCar *S, CarNode *p)
{
S->top++;
cout << "汽车停在停车场第" << S->top << "个位置" << endl;
loop:
cout << "汽车到达的时间为[小时(0-23)和分钟(0-59)以空格隔开]:";
cin >> p->reach.hour >> p->reach.min;
while ((p->reach.hour<0 || p->reach.hour>23) || (p->reach.min<0 || p->reach.min>59))
{
cout << endl << "你的输入时间范围有误,请重新输入!" << endl << endl;
goto loop;
}
S->data[S->top] = p;
cout << endl << "*************汽车进入停车场成功*************" << endl << endl;
return 0;
}
int PushStack(StackCar *S, CarNode *p)
{
S->top++;
S->data[S->top] = p;
return 0;
}
int Pop(StackCar *S, CarNode *(&p))
{
p = S->data[S->top];
S->top--;
return 0;
}
int EnQueue(QueueCar *Q, CarNode *p)
{
cout << endl << "停车场车位已满,请该汽车在便道上停靠等待!" << endl;
QueueNode *t;
t = (QueueNode*)malloc(sizeof(QueueNode));
if (!t) exit(ERROR);
t->data = p;
t->next = NULL;
Q->rear->next = t;
Q->rear = t;
cout << "************汽车在便道上停靠成功***********" << endl << endl;
return 0;
}
int DeQueue(QueueCar *Q, CarNode *(&q))
{
QueueNode *t;
t = Q->front->next;
q = t->data;
Q->front->next = t->next;
if (Q->rear == t)
Q->rear = Q->front;
free(t);
return 0;
}
void PriceCal(CarNode *p, int Location) //计算价格
{
loop:
cout << "请输入汽车离开的时间[小时(0-23)和分钟(0-59)以空格隔开]:";
cin >> p->leave.hour >> p->leave.min;
while ((p->leave.hour<0 || p->leave.hour>23) || (p->leave.min<0 || p->leave.min>59))
{
cout << "你的输入时间范围有误,请重新输入!" << endl;
goto loop;
}
cout << "离开汽车的车牌号为:";
cout << p->num << endl;
cout << "该汽车到达的时间为:";
cout << p->reach.hour << ":" << p->reach.min << endl;
cout << "该汽车离开的时间为:";
cout << p->leave.hour << ":" << p->leave.min << endl;
cout << "该汽车应交费用为:<单位:元>";
if ((p->leave.hour<p->reach.hour) || ((p->leave.hour == p->reach.hour) && (p->leave.min<p->reach.min)))
cout << fixed << setprecision(2) << ((23 - p->reach.hour + p->leave.hour) * 60 + (60 - p->reach.min + p->leave.min))*Price << endl << endl;
else
cout << fixed << setprecision(2) << ((p->leave.hour - p->reach.hour) * 60 + (p->leave.min - p->reach.min))*Price << endl << endl;
free(p);
}
void InCarPark(StackCar *Enter, QueueCar *Q)
{
CarNode *p;
p = (CarNode*)malloc(sizeof(CarNode));
cout << "请输入到达汽车的车牌号:";
cin >> p->num;
if (Enter->top<Max)
{
Push(Enter, p);
}
else
{
EnQueue(Q, p);
}
}
void OutCarPark(StackCar *Out, StackCar *Temp, QueueCar *Q)
{
int Location;
CarNode *p, *q;
if (Out->top>0)
{
loop: cout << "请输入汽车在停车场的位置<1-" << Max << ">:";
cin >> Location;
if (Location<1 || Location>Out->top)
{
cout << "停车场该车位还未停车,请重新输入!" << endl;
goto loop;
}
while (Out->top>Location)
{
Pop(Out, p); //Out,Out->data[Out->top];
PushStack(Temp, p); //Temp,Out->data[Out->top];
}
Pop(Out, p);
PriceCal(p, Location);
while (Temp->top >= 1)
{
Pop(Temp, p); //Temp,Temp->data[Temp->top];
PushStack(Out, p); //Out,Temp->data[Temp->top];
}
if ((Q->front != Q->rear) && Out->top<Max)
{
DeQueue(Q, q); //将队列结点t取值data赋给结点q并出队列;
cout << "*************便道车位位置[1]的汽车将进入停车场**************" << endl;
Push(Out, q);
}
else
cout << endl << "*******便道上没有汽车,停车场没有进入新的汽车!**********" << endl << endl;
}
else
cout << "***********停车场里没有汽车可以选择离去!*************" << endl << endl;
}
void DisplayStack(StackCar *S)
{
int i;
cout << "你需要查看的停车场停车情况如下:" << endl;
if (S->top>0)
{
for (i = 1; i <= S->top; i++)
{
cout << "在停车场的车位位置:" << i << endl;
cout << "该车位汽车的车牌号:" << S->data[i]->num << endl;
cout << "到达时间:" << S->data[i]->reach.hour << ":" << S->data[i]->reach.min << endl << endl;
}
}
else
cout << endl << "停车场里没有车,所以无法显示你要查看的停车信息!" << endl << endl;
}
void DisplayQueue(QueueCar *Q)
{
QueueNode *t;
int i;
t = Q->front->next;
if (Q->front != Q->rear)
{
cout << "你需要查看的便道停车情况如下:" << endl;
for (i = 1; t != NULL; i++)
{
cout << "在便道上的车位位置:" << i << endl;
cout << "该车位汽车的车牌号:" << t->data->num << endl << endl;
t = t->next;
}
}
else
cout << "便道上没有车,所以无法显示你要查看的停车信息!" << endl << endl;
}
void menu()
{
cout << "*****************欢迎来到停车场管理系统************** " << endl << endl;
cout << " 1.汽车到达停车场操作 " << endl;
cout << " 2.汽车离去停车场操作 " << endl;
cout << " 3.停车场停车信息显示 " << endl;
cout << " 4.便道停车信息显示 " << endl;
cout << " 0.退出停车场管理系统 " << endl << endl;
cout << "******************************************************" << endl;
}
int main()
{
StackCar S, Temp;
QueueCar Q;
char M;
InitStack(&S);
InitStack(&Temp);
InitQueue(&Q);
while (1)
{
menu();
cout << "请输入你要选择的功能序号:";
cin >> M;
getchar();
cout << endl;
switch (M)
{
case '1': InCarPark(&S, &Q); system("pause"); system("cls"); break;
case '2': OutCarPark(&S, &Temp, &Q); system("pause"); system("cls"); break;
case '3': DisplayStack(&S); system("pause"); system("cls"); break;
case '4': DisplayQueue(&Q); system("pause"); system("cls"); break;
case '0': return 0;
default: cout << "你的选择有误,此管理系统没有此项功能!" << endl << endl;
}
}
system("pause");
}