2.停车场管理
停车场用栈模拟,栈以顺序结构实现;停车场外的便道用队列模拟,而队列用链式结构实现。需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含六个数据项:汽车的牌照号码,入场的时刻,出场的时刻,入场为值,便道位置及所需费用。其中时间也是个结构体,有小时和分钟两个数据项。结构如下:
struct Time{ int hour; //时int min; //分 };
struct Car{
int inplac;e//入场位置 int outplace;//便道位置
char num[20]; //车牌号 struct Time in; //入场时间
struct Time out;//出场时间 double price; //所需费用
};
Ø 算法设计分析
1. void Arrive(SqStack &S,LinkQueue &Q,ElemType e)//汽车到达,需要先判断停车场是否已停满,如果还有空位就进栈,同时记录入场时间,否则就停在车场外的便道上,即入队。标记在停车场中的位置或在便道上的位置。算法如下:
if(S.top-S.base>=S.stacksize) //判满
{
cout<<"车场内已停满车!"<<endl;
cout<<"在便道上的停车位置:";
e.outplace=++OutPlace; cout<<e.outplace<<endl;
EnQueue(Q,e);//进队
}
else //停车场有位置
{
cout<<"输入到达时间:";
cin>>e.in.hour>>c>>e.in.min;
Push(S,e); e.inplace=++InPlace;
cout<<"在停车场中的位置:"; cout<<e.inplace<<endl;
}
2. void Leave(SqStack &S,SqStack &s,LinkQueue &Q,char num[20])//汽车离开停车场,根据车牌号找需要离开的汽车,让栈顶元素依次出栈,知道找到为止,另外让出来的车进入临时栈s中,算法如下:
e=Pop(S);
while(strcmp(e.num,num)!=0)//从栈顶按车牌号找要离开的车
{
Push(s,e); //把出来的车进个临时栈里
e=Pop(S);
}
输入离开时间,计算该车的停留时间及应缴纳的费用。然后让退出车场的车再按原次序进入车场,并改变在停车场中的位置,即都进1,算法如下:
while(s.base!=s.top)//把退出车场的车再按原次序进入车场
{
e1=Pop(s);
e1.inplace--; //在停车场的位置进1
Push(S,e1);
}
如果便道上有车,即队不空,让第一辆车开入(进栈),此时标记该车进入车场的时间等于上辆车的离开时间,主要算法如下:
if(Q.rear!=Q.front) //如果便道有车,第一辆车开入
{
e2=DeQueue(Q); Push(S,e2);//进入停车场
e2.in.hour=e.out.hour;//进入车场时间等于上辆车的离开时间
e2.in.min=e.out.min;
e2.inplace=++InPlace; //在停车场的位置加1
}
如果便道有车,则依次前进,即在便道上的停车位置减1,程序如下:
QNode *p=Q.front->next;
if(Q.front!=Q.rear)//如果便道有车,则依次前进
{
while(p)
{
p->data.outplace--;//在便道的停车位置减1
p=p->next;
}
OutPlace--; //便道位置的总长减1
}
源代码:
#include<string.h>
#include<stdlib.h>
#define OVERFLOW -2
#define Max 3 //停车场容量
#define Price 0.01//按分钟收费
struct Time{
int hour; //时
int min; //分
};
struct Car{
int inplace;//入场位置
int outplace;//便道位置
char num[20]; //车牌号
struct Time in; //入场时间
struct Time out;//出场时间
double price; //所需费用
};
typedef Car ElemType;
//栈的顺序存储表示
typedef struct{
ElemType *base; //在栈构造之前和销毁之后,base的值为NULL
ElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
//队列的链式存储结构
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
char c;
int InPlace=0,OutPlace=0;//标记停车位置,初始化为0
//栈的基本操作
void InitStack(SqStack &S)//构造空栈S
{
S.base=new ElemType[Max];
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base;
S.stacksize=Max;
}
void Push(SqStack &S,ElemType e)//进栈
{
if(S.top-S.base>=S.stacksize)
{
if(!S.base) exit(OVERFLOW) ;
S.top=S.base+S.stacksize;
}
*S.top++=e;
}
ElemType Pop(SqStack &S) //出栈
{
ElemType e;
if(S.top==S.base) cout<<"栈空"<<endl ;
e=*--S.top;
return e;
}
//队列的基本操作
void InitQueue(LinkQueue &Q) //构造空队列Q
{
Q.front=Q.rear=new QNode;
if(!Q.front) exit(OVERFLOW); //存储分配失败
Q.front->next=NULL;
}
void EnQueue(LinkQueue &Q,ElemType e)//入队
{
QNode *p;
p=new QNode;
if(!p) return ;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
ElemType DeQueue(LinkQueue &Q)//出队
{
ElemType e;
QNode *p;
if(Q.front==Q.rear) cout<<"队空"<<endl;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
delete p;
return e;
}
void Arrive(SqStack &S,LinkQueue &Q,ElemType e)//车辆到达
{ //栈S为停车场,队列Q为便道
if(S.top-S.base>=S.stacksize)
{
cout<<"车场内已停满车!"<<endl;
cout<<"在便道上的停车位置:";
e.outplace=++OutPlace;
cout<<e.outplace<<endl;
EnQueue(Q,e);
}
else
{
cout<<"输入到达时间:";
cin>>e.in.hour>>c>>e.in.min;
Push(S,e);
e.inplace=++InPlace;
cout<<"在停车场中的位置:";
cout<<e.inplace<<endl;
}
}
void Leave(SqStack &S,SqStack &s,LinkQueue &Q,char num[20])//车辆离开
{
int time;
ElemType e,e1,e2;
e=Pop(S);
while(strcmp(e.num,num)!=0)//从栈顶按车牌号找要离开的车
{
Push(s,e); //把出来的车进个临时栈里
e=Pop(S);
}
InPlace--; //车离开,多个空位
cout<<"请输入离开时间:";
cin>>e.out.hour>>c>>e.out.min;
time=e.out.hour*60+e.out.min-(e.in.hour*60+e.in.min);
cout<<"停留的时间(分钟):";
cout<<time;
e.price=Price*time;
cout<<"**********应交纳的费用(元):";
cout<<e.price<<endl;
while(s.base!=s.top)//把退出车场的车再按原次序进入车场
{
e1=Pop(s);
e1.inplace--; //在停车场的位置进1
Push(S,e1);
}
if(Q.rear!=Q.front) //如果便道有车,第一辆车开入
{
e2=DeQueue(Q);
e2.in.hour=e.out.hour;//进入车场时间等于上辆车的离开时间
e2.in.min=e.out.min;
cout<<"车牌号为"<<e2.num<<"到达时间:";
cout<<e2.in.hour<<":"<<e2.in.min;
cout<<"----------在停车场中的位置:";
e2.inplace=++InPlace; //在停车场的位置加1
cout<<e2.inplace<<endl;
Push(S,e2); //(***变量名不能标错***)
}
QNode *p=Q.front->next;
if(Q.front!=Q.rear)//如果便道有车,则依次先前进
{
while(p)
{
p->data.outplace--;//在便道的停车位置减1
p=p->next;
}
OutPlace--; //便道位置的总长减1(***易错点***)
}
}
int main()
{
Car car;
SqStack S,s;//栈S为停车场,s为临时栈
LinkQueue Q;//队列Q为便道
char ch,str[20];
InitStack(S);//初始化
InitStack(s);
InitQueue(Q);
cout<<"*****************欢迎进入停车管理系统******************"<<endl;
cout<<"-------------操作如下:"<<endl;
cout<<"-------------A.到达"<<endl;
cout<<"-------------L.离去"<<endl;
cout<<"-------------E.退出"<<endl;
while(1)
{
cout<<"请选择操作:";
cin>>ch;
switch(ch)
{
case 'A': cout<<"请输入到达汽车的车牌号:";
cin>>car.num;
Arrive(S,Q,car); break;
case 'L': cout<<"请输入要离开汽车的车牌号:";
cin>>str;
Leave(S,s,Q,str); break;
case 'E': exit(0);
}
cout<<endl;
}
return 0;
}