设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
【基本要求】
以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。
二、停车场管理(栈和队列的应用)
[问题描述]
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
[实现提示]
以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。
3、 算法设计
算法思想
建立两个栈一个作为停车场,另一个作为临时栈,建立一个队列。使用栈和队列的配合使用,进行停车场的建立,栈以顺序存储结构实现,队列以链表结构实现。首先在栈空的时候,使车辆进栈,保存车辆的进栈信息,以及输入时间和代码,当栈的指针指向栈顶,及大于stack[MAX+1]时,那么以后的车就先进入便道,当停车场的车有离开的时候,那么在该车以后的车在p++的引导下,相继开出停车场并进入临时栈,当该车开出的时候,那么刚才出去的车在按照先前的次序依次进栈,再把先前停在便道上的车按次序进栈。定义栈的顺序存储结构和队列的链式存储结构,同时定义栈顶指针top和栈底指针base。然后初始化栈,同时定义在停车时的停车时间time和所需要的费用mony的关系当车进入的时候栈顶元素+1,在当车进来的时候在+1,直到空间不足,当车进来的时候显示停车场已经停满,要停到便道上,便道元素+1;当停车场的车出来一辆之后,便道上的车才能进入停车场,队列元素减1,栈元素加1。而离开的车辆则输出离开的时间,调用计费函数,进行停车费的计算。
#include
using namespace std;
//创建数据
#define MAX 3//停车厂大小。
#define size 4//车牌号
#define ture 1
#define flose 0
//时间的结构,时,分。
struct time
{
int hour;
int min;
};
//汽车“到达”或“离去”信息。
struct Car
{
char Info[size];//车辆信息
time reach;//到达时间
time leave;//离去时间
} ;
//汽车的排列栈。
struct Carlist
{
Car data[MAX+1];//引用结构struct Car
int Top;
};
//汽车便道的排列队列//只需记录汽车的车牌信息。
struct carqueue
{ Car data;/*留个思考这里如果是一个数组,则对象*q应如何去使用。*/
//int front;可以不要,因初始对象&q时,*q可代替*front。
int rear,*next;
} ;
//存储数据并进行操作
//先-用'顺序栈'存储停车场信息
void stacklist(Carlist &s)//初始化栈
{
s.Top=0;
}
//将单个汽车进入停车场信息记录。
void push(Carlist &s,int i)//将信息入栈
{
int j=0; /*char[]为车牌信息。车牌号记住了,
但不能防止输入的是相同车牌/
char num;
while(j {
cin>>num;
s.data[i].Info[j++]=num;
}
cout<<"输入汽车到达时间:";
cin>>s.data[i].reach.hour;cin>>s.data[i].reach.min;
if(s.data[i].reach.hour>=10&&s.data[i].reach.min>=10)
cout<<"即 时间为: "<< s.data[i].reach.hour<<":"<<s.data[i].reach.min<<endl;
else if(s.data[i].reach.hour<10&&s.data[i].reach.min>=10)
cout<<"即 时间为: "<<0<<s.data[i].reach.hour<<":"<<s.data[i].reach.min<<endl;
else if(s.data[i].reach.hour>=10&&s.data[i].reach.min<10)
cout<<"即 时间为: "<<s.data[i].reach.hour<<":"<<0<<s.data[i].reach.min<<endl;
else//(s.data[i].reach.hour<10&&s.data[i].reach.min<10)
cout<<"即 时间为: "<<0<<s.data[i].reach.hour<<":"<<0<<s.data[i].reach.min<<endl;
}
//建立停车场的栈。当有车来就入栈,直到栈满。
void initput(Carlist &s)
{
int i=++s.Top;//为什么最后一次s.top!=MAX; (已解决)
cout<<"由北算起第"< push(s,i);//将单个车信息记录。
}
//计算费用。
double price(Carlist s,int i)
{
int ihour=s.data[i].reach.hour,imin=s.data[i].reach.min;
int ohour=s.data[i].leave.hour,omin=s.data[i].leave.min;
double cprice=0.20;//0.2元每分钟。
double count;
count=((ohour*60+omin)-(ihour*60+imin))*cprice;
return count;
}
//判断停车场是否已满
int judge(Carlist s)
{
if(s.Top>=MAX)
return flose;
else
return ture;
}
//汽车出库的情
void output(Carlist &s,Carlist &s0,int i )
{
cout<<"\n请输入需出库的车辆位置:\n";
cin>>i;
if(i>s.Top||(i3)){cout<<"\n输入的信息有误,error\n请重新输入:";}
else{
cout<<"出库的是第"< //输出车辆信息。
cout for(int j=0;j {
cout }
//出库则给上出库的情况。
//出库的时间,
cout cin>> s.data[i].leave.hour>>s.data[i].leave.min;
//修缮语句。
if(s.data[i].leave.hour>=10&&s.data[i].leave.min>=10)
cout<<"即 时间为: "< else if(s.data[i].leave.hour=10)
cout<<"即 时间为: "< else if(s.data[i].leave.hour>=10&&s.data[i].leave.min<10)
cout<<"即 时间为: "<<s.data[i].leave.hour<<":"<<0<<s.data[i].leave.min<<endl;
else//(s.data[i].reach.hour<10&&s.data[i].reach.min<10)
cout<<"即 时间为: "<<0<<s.data[i].leave.hour<<":"<<0<<s.data[i].leave.min<<endl;
//及应缴的费用
cout<<"\n应缴的费用为:";
cout<<price(s,i)<<"元\n";//如要调用该函数需将其写在前面。
//为什么结果没有小数。答:因为刚开始函数price()为int型,返回值是int型。
//判断车的位置应该如何处理。
//1.车为最后一个数,或者该车后面没有停车。直接删除。
if(s.Top==i)//if((i==3)||(s.Top=i)) //为最后一个数,或者该车后面没有停车。
{
s.Top--;
}
//若是此车位前或后有车。 //则需要另一个栈。
/*这下面的一个语句会误导程序,即i与s.top因上面一个语句s.top减少1,故而
这个下面这个程序内又会进行,而我们想的是相互独立进行,则要防止产生这些情
况,需要将下面的‘if'改为’else if‘使两者独立。*/
else if((i!=s.Top)&&(i>0&&i<3))//此为严格按照栈的特性来写。
{ //此语句总觉得欠妥,需改善。
while(s.Top>i)
{
s0.data[++s0.Top]=s.data[s.Top--]; //3,2,1
}
while(s0.Top!=0)
{
s.data[s.Top++]=s0.data[s0.Top--];
}
s.Top--;
}
}
//此语句放在这更好,但要改良,精炼输出语句,也可如上
// else cout<<"\n输入的是错误信息!error\n"
}
//最后,即用一个队列存储便道上的汽车。队列有车。则
//还要进行判断。
//如果‘队列有车‘,则汽车入库时可以直接将信息导入 .
//否则不更改,直接用原程序。
void Carstreet(Carlist &s,carqueue &q);//便道处理。
//测验
int main()
{
Carlist s;
Carlist s0;
stacklist(s);
stacklist(s0);
//汽车入栈。
//有车入栈,无车也不影响程序进行
while(ture)//该循环可以使得汽车一个个入栈,建立栈。
{ //可以一个个对汽车进行操作。
cout<<"****************欢迎来到停车管理系统***********************\n";
cout<<"车库内车的数量是:"< /*s.top有问题,
//为什么有问题因为data[MAX],改为data[MAX+1]
//为什么?因为i=s.top这个只能 data[]数组只能容纳data[1],data[2].
//故而当s.top=3时data[]数组不能接受数据。虽然i可以等于3,
//但是 initput()函数中push()不能很好执行。这就导致错误。
*/
cout cout int instruct;
cout cin>>instruct;
switch(instruct)
{
case 1://入库。
//分库满与不满的情况
if(judge(s)==flose)
cout<<"\n不好意思,停车场已满,请等待。\n";
else
initput(s); //为什么最后一次s.top!=MAX;(已解决)
break;
/*下面这样写会有第一次正常运行,下一次则
从5(即最后一个)直接跳到3或2,1等别的数且不会结束的情况。*/
//解决该情况
//1.如果将这个循环改为可结束循环则依旧无法改善这个问题。
//2.将MAX的大小进行缩减。依旧无法解决。
//3.(解决)如上93至96行,将'if()中语句'与'else()中语句'交换。
/* if(judge(s)!=0)
{
initput(s);break;
//分库满与不满的情况
}
else cout<<"\n不好意思,停车场已满,请等待。\n";*/
case 2://出库
int i;
output(s,s0,i);
break;
default:
cout<<"\n输入指令错误。\n";
break;
//可以再加一个退出循环语句。
}
}
return 0;
}