您的位置:首页 > 其它

停车场管理(栈和队列的应用)

2016-12-17 13:39 225 查看

停车场管理(栈和队列的应用)

[问题描述]

设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

[实现提示]

以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。

要点提示:当停车场中的车辆离开的时候,便道上的第一辆车进入停车场;便道上的车辆离开时,不影响停车场中的车辆;还有一个很重要的地方,就是当停车场的车辆出去的时候,便道上的第一辆车进入停车场,但是它的停车时间一定要更新,它进入停车场的时间就是上一辆车离开停车场的时间,刚开始因为粗心忽略了这个问题,惭愧,hahah
源代码

#include<iostream>
#include<stdio.h>
#include<string>
4000

#include<string.h>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>
#include<math.h>
#include<vector>
#include<iomanip>
#include<map>
#include<list>
using namespace std;

int num,price;
//停车场可停最大车辆数和停车价格
struct Parking
{
int id;
int time;
}park[50];
typedef struct QNode
{
int id;
int time;
QNode *next;
QNode()
{
next=NULL;
}
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

int InitQueue(LinkQueue &Q)
{//创建队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
{
cout<<endl<<"创建失败!";
return 0;
}
Q.front->next=NULL;
return 1;
}

int EnQueue(LinkQueue &Q,QNode e)
{//在链式队列尾插入新元素
QNode *p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
{
cout<<endl<<"创建节点失败!";
return 0;
}
p->id=e.id;
p->time=e.time;
p->next=NULL;
if(Q.front==NULL)
{
Q.front=Q.rear=p;
return 1;
}
Q.rear->next=p;
Q.rear=p;
return 1;
}

int DeQueue(LinkQueue &Q,QNode &e)
{//在链式队列头删除旧元素
if(Q.front==Q.rear)
{
cout<<endl<<"队列空,无可弹出元素!";
return 0;
}
QNode *p;
p=Q.front->next;
e.id=p->id;
e.time=p->time;
Q.front->next=p->next;
free(p);
return 1;
}

bool Find_car(LinkQueue &Q,int n_id)
{//查找编号n_id车辆是否在便道上
QNode *p=Q.front;
while(p->next)
{
if(p->next->id==n_id)
{
cout<<"汽车"<<n_id<<"离开,共消费"
<<0<<"元。"<<endl;
p->next=p->next->next;//查找成功后删除节点
return 1;
}
p=p->next;
}
return 0;
}

void PrintQueue(LinkQueue &Q)
{//遍历并输出队列中的元素
QNode *p=Q.front->next;
int i=0;
while(p)
{
i++;
cout<<"("<<p->id<<","<<p->time<<")";
if(i%4==0)cout<<endl;
p=p->next;
}
}

void menu()
{
cout<<endl;
cout<<"           ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<"                         停车场管理系统             "<<endl;
cout<<"           ◇                                      ◇"<<endl;
cout<<"                          1、车辆到达                "<<endl;
cout<<"           ◇             2、车辆离开              ◇"<<endl;
cout<<"                          3、显示车辆                "<<endl;
cout<<"           ◇             4、退出系统              ◇"<<endl;
cout<<endl;
cout<<"           ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<endl;
cout<<endl;
cout<<"请选择功能:"<<endl;
}

int main()
{
system("color 37");
cout<<endl;
cout<<"           ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<endl;
cout<<"           ◇         欢迎进入停车场管理系统       ◇"<<endl;
cout<<endl;
cout<<"           ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<endl;
cout<<"请输入停车场可停最大车辆数(整数):";
cin>>num;
cout<<"请输入停车场停车价格(整数/元):";
cin>>price;
LinkQueue Q;
InitQueue(Q);
int n_park=0,n_id,n_time;
int n;char flat;
while(1)
{
skip:        system("cls");
menu();
cin>>n;
if(n==1)
{
cout<<"请输入车牌号和到达时间:"<<endl;
if(n_park<num)
{
cin>>park[n_park].id>>park[n_park].time,n_park++;
cout<<"为您安排"<<n_park<<"号停车位。"<<endl;
}
else
{
QNode q;
cin>>q.id>>q.time;
cout<<"停车场已满,请在便道上排队。"<<endl;
EnQueue(Q,q);
}
system("pause");
}
else if(n==2)
{
cout<<"请输入车牌号和离开时间:"<<endl;
cin>>n_id>>n_time;
int book=1,i;
for(i=0;i<n_park;i++)
{//查找该车是否在停车场中
if(park[i].id==n_id)
{
book=0;
if(n_time<park[i].time)
{cout<<"输入时间有误"<<endl;break;}
cout<<"汽车"<<park[i].id<<"离开,共消费"
<<price*(n_time-park[i].time)<<"元。"<<endl;
cout<<"查找成功!"<<endl;
break;
}
}
if(book)
{//如果在停车场中没有找到该车
if(Find_car(Q,n_id))
cout<<"查找成功!"<<endl;
else
cout<<"未找到该车!"<<endl;
}
else
{//如果在停车场中找到该车,该车出队
//并且便道上的第一辆车进入停车场
QNode e;
DeQueue(Q,e);
e.time=n_time;
//更新即将进入停车场的车辆时间,
//它进入停车场的时间也就是上一辆车出停车场的时间
for(;i<n_park-1;i++)
park[i]=park[i+1];
park[i].id=e.id;
park[i].time=e.time;
}
system("pause");
}
else if(n==3)
{
cout<<"停车场中的车辆:";
for(int i=0;i<n_park;i++)
{
cout<<"("<<park[i].id<<","<<park[i].time<<")";
if(i%4==0&&i!=0)cout<<endl;
}
cout<<endl;
cout<<"便道上的车辆:";
PrintQueue(Q);
cout<<endl;
system("pause");
}
else if(n==4)
{
system("pause");
break;
}
else
{
cout<<"输入有误,请重新输入!"<<endl;
system("pause");
goto skip;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: