版权声明:转载请留言 https://blog.csdn.net/qq_40744093 https://blog.csdn.net/qq_40744093/article/details/86242009
停车场管理(栈和队列的应用)
[问题描述]
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
[实现提示]
以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。
[设计思路]
- 进行结构体以及栈和指针的声明
- 分别构造栈和队列作为停车场和便道
- 栈和队列的入栈和出栈,进队列和出队列代表停车场进出车辆和便道的进出车辆。
- 在主函数中进行各个函数的调用
[代码及注释]
#include<iostream>
#include<cstring>
using namespace std;
#define MAXSIZE 3 /*停车场最大停车数*/
#define Price 0.02 /*停车场每分钟收费价格*/
int flag=0; /*判断程序是否结束*/
//结构
typedef struct{
string id; /*车牌号*/
int stime; /*到达时间*/
}Car; /*车辆类型*/
typedef struct{
Car c[MAXSIZE+1]; /*MAXSIZE辆车,0号不用*/
int top; /*下标代替指针*/
}SqStack; /*顺序栈,表示停车场*/
typedef struct QNode{
Car c; /*一辆车*/
QNode *next; /*指针域*/
}QNode,*QueuePtr; /*结点类型,结点指针类型*/
typedef struct{
QueuePtr Front; /*头指针*/
QueuePtr Real; /*尾指针*/
int length; /*链队长度*/
}LinkQueue; /*链队,表示便道*/
//子函数
void InitSqStack(SqStack &S); /*初始化顺序栈*/
void InitLinkQueue(LinkQueue &Q); /*初始化链队*/
bool ArriveJudge(SqStack &S,LinkQueue &Q,Car car); /*判断到达车辆是否合法*/
bool Full(SqStack &S); /*判断栈是否满*/
void Push(SqStack &S,Car car); /*入栈*/
void EnQueue(LinkQueue &Q,Car car); /*入队*/
void Arrive(SqStack &S,LinkQueue &Q); /*车辆到达*/
void Pop(SqStack &S); /*出栈*/
void DeQueue(LinkQueue &Q,Car &car); /*出队*/
void Leave(SqStack &S,SqStack &TempS,LinkQueue &Q); /*车辆离开*/
void QueryPark(SqStack &S); /*查询停车场*/
void QueryRoad(LinkQueue &Q); /*查询便道*/
void Menu(SqStack &S,SqStack &TempS,LinkQueue &Q); /*操作汇总*/
//具体
void InitSqStack(SqStack &S){S.top=0;}
void InitLinkQueue(LinkQueue &Q)
{
Q.Front=Q.Real=new QNode;
Q.Front->next=NULL;
Q.Front->c.stime=0;
Q.length=0;
}
bool ArriveJudge(SqStack &S,LinkQueue &Q,Car car)
{
if(car.stime<=0){cout<<"<<<<到达时间不合法!"<<endl;return false;}
for(int i=1;i<=S.top;++i)
{
if(S.c[i].id==car.id){cout<<"<<<<该车已在停产场内!"<<endl;return false;}
if(S.c[i].stime>car.stime){cout<<"<<<<到达时间不合法!"<<endl;return false;}
}
QueuePtr p=Q.Front->next;
while(p)
{
if(p->c.id==car.id){cout<<"<<<<该车已在便道内!"<<endl;return false;}
p=p->next;
}
if(Q.Real->c.stime>car.stime){cout<<"<<<<到达时间不合法!"<<endl;return false;}
return true;
}
bool Full(SqStack &S)
{
if(S.top==MAXSIZE)return true;
return false;
}
void Push(SqStack &S,Car car)
{
S.top++;
S.c[S.top]=car;
}
void EnQueue(LinkQueue &Q,Car car)
{
QueuePtr s=new QNode;
s->c=car;
s->next=NULL;
Q.Real->next=s;
Q.Real=s;
Q.length++;
}
void Arrive(SqStack &S,LinkQueue &Q)
{
int hour,fen;
Car car;
cout<<"车牌号:";
cin>>car.id;
cout<<"到达时间(输入小时与分钟,空格隔开):";
cin>>hour>>fen;
if(hour<0||hour>23||fen<0||fen>59){cout<<"<<<<输入时间不合法"<<endl;return;}
car.stime=hour*60+fen;
if(!ArriveJudge(S,Q,car))return;
if(!Full(S)){Push(S,car);cout<<"<<<<停车位置:"<<S.top<<endl;}
else{EnQueue(Q,car);cout<<"<<<<停车场满,已进便道候车"<<endl;}
}
void Pop(SqStack &S)
{
S.top--;
}
void DeQueue(LinkQueue &Q,Car &car)
{
QueuePtr p=Q.Front->next;
car=p->c;
Q.Front->next=p->next;
if(p==Q.Real)Q.Real=Q.Front;
delete p;
Q.length--;
}
void Leave(SqStack &S,SqStack &TempS,LinkQueue &Q)
{
if(S.top==0){cout<<"<<<<停车场空空如也!"<<endl;return;}
string ID;
int ETIME,hour,fen;
cout<<"车牌号:";
cin>>ID;
cout<<"离开时间(输入小时与分钟,空格隔开):";
cin>>hour>>fen;
if(hour<0||hour>23||fen<0||fen>59){cout<<"<<<<输入时间不合法"<<endl;return;}
ETIME=hour*60+fen;
int k=-1;
for(int i=1;i<=S.top;++i)
if(S.c[i].id==ID){k=i;break;}
if(k==-1)
{
QueuePtr p=Q.Front;
while(p->next)
{
if(p->next->c.id==ID)
{
QueuePtr s=p->next;
if(s->c.stime>ETIME){cout<<"<<<<离开时间不合法"<<endl;return;}
p->next=s->next;
if(s==Q.Real)Q.Real=p;
delete s;
cout<<"<<<<已从便道离开"<<endl;
return;
}
p=p->next;
}
cout<<"<<<<没有此车"<<endl;return;
}
else
{
if(S.c[k].stime>ETIME){cout<<"<<<<离开时间不合法"<<endl;return;}
cout<<"-----------"<<endl;
cout<<"|车牌号:"<<ID<<endl;
cout<<"|应收费:"<<Price*(ETIME-S.c[k].stime)<<endl;
cout<<"-----------"<<endl;
for(int i=S.top;i>k;--i)
{
Push(TempS,S.c[i]);
Pop(S);
}
Pop(S);
for(int i=TempS.top;i>=1;--i)
{
Push(S,TempS.c[i]);
Pop(TempS);
}
cout<<"<<<<已从停车场离开"<<endl;
if(Q.Front!=Q.Real)
{
Car car;
DeQueue(Q,car);
car.stime=ETIME;
Push(S,car);
}
}
}
void QueryPark(SqStack &S)
{
if(S.top==0){cout<<"<<<<停车场空空如也"<<endl;return;}
cout<<"停车场总车辆:"<<S.top<<endl<<endl;
for(int k=S.top;k>=1;--k)
{
cout<<"|车牌号:"<<S.c[k].id<<endl;
cout<<"|位置:"<<k<<endl;
cout<<"-----------"<<endl;
}
}
void QueryRoad(LinkQueue &Q)
{
if(Q.Front==Q.Real){cout<<"<<<<便道空空如也"<<endl;return;}
QueuePtr p=Q.Front->next;
cout<<"便道总车辆:"<<Q.length<<endl;
cout<<"按照顺序如下:"<<endl;
while(p){cout<<"|车牌号:"<<p->c.id<<endl;p=p->next;}
}
void Menu(SqStack &S,SqStack &TempS,LinkQueue &Q)
{
cout<<" -----------------------------------"<<endl;
cout<<" | 欢迎来到停车场管理系统 |"<<endl;
cout<<" |-----------------------------------|"<<endl;
cout<<" | 1--车辆到达 |"<<endl;
cout<<" | 2--车辆离去 |"<<endl;
cout<<" | 3--查看停车场 |"<<endl;
cout<<" | 4--查看便道 |"<<endl;
cout<<" | 其他--退出 |"<<endl;
cout<<" -----------------------------------"<<endl;
int op;
cout<<"输入你的选择:";
cin>>op;
switch(op)
{
case 1:Arrive(S,Q);break;
case 2:Leave(S,TempS,Q);break;
case 3:QueryPark(S);break;
case 4:QueryRoad(Q);break;
default:flag=1;cout<<"<<<<欢迎下次再来,再见!"<<endl;
}
}
int main()
{
SqStack S,TempS;
LinkQueue Q;
InitSqStack(S);
InitSqStack(TempS);
InitLinkQueue(Q);
while(1)
{
Menu(S,TempS,Q);
if(flag)break;
system("pause");
system("cls");
}
return 0;
}
[简单展示]