PS:题目网上所找
1.前言
因为学到了数据结构,并且想写点题玩玩,正好看到了这个题,就写写看。第一次写博客,代码也会有很多问题。所以希望各位看官老爷手下留情,遇到了问题,还请评论区指正。
2.问题概述
1.由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。
2.而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。
3.排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来实现。
因此,本题求解过程中需用到两个栈和一个队列。栈和队列都既可以用顺序结构实现,也可以用链式结构实现。
3.代码实现
#include <iostream>
#include <stdlib.h>
#define max_size 5
using namespace std;
class car
{
public:
int num;
int cartime;
};
class shortpark:public car
{
public:
bool inputshortpark(int cartemp,int realtime);//进入便道程序
shortpark(){shorttop=shortrear=0;shortpsum=0;spdata=new car [max_size];}
~shortpark(){delete []spdata;}
private:
int shorttop;
int shortrear;
car * spdata;
protected:
int shortpsum;//便道计数器----QAQ这里实在不会写了偷个懒
};
bool shortpark::inputshortpark(int cartemp,int realtime)
{
if((shortrear+1)%max_size==shorttop)
{
cout<<"便道已满,请另选停车场。"<<endl;
return true;
}
spdata[shortrear%max_size].num=cartemp;
spdata[shortrear%max_size].cartime=realtime;
shortpsum++;
shortrear=(shortrear+1)%max_size;
cout<<"车牌号为"<<spdata[shortrear].num<<"的车辆进入便道"<<endl;
return true;
}
class waitspace:public car
{
public:
waitspace(){waittop=-1;wsdata=new car[max_size];}
~waitspace(){delete [] wsdata;}
bool inputwaitspace(car T);//这里写入等待区
//bool outputwaitspace();//这里写退出等待区
car outputwaitspacetemp();
private:
int waittop;
car * wsdata;
};
bool waitspace::inputwaitspace(car T)
{
//因为逻辑,所以不测验为满
waittop++;
wsdata[waittop]=T;
}
/*
bool waitspace::outputwaitspace()
{
if(waittop==-1)
{
return true;
}
outputwaitspacetemp();
}*/
car waitspace::outputwaitspacetemp()
{
return wsdata[waittop--];
}
class park:public shortpark,public waitspace
{
public:
park(){top=-1;data=new car[max_size];carsum=0; }
~park(){delete []data;}
bool inputcar(int cartemp,int realtime); //进入停车场
bool showcar(int realtime);//打印停车场和便道等待的车辆
bool parkcut(int carnum,int realtime);//退出停车场
int carsum;
private:
car * data;
//int rear;//尾指针
int top;//头指针
};
bool park::inputcar(int cartemp,int realtime)
{
if(top==max_size-1)
{
cout<<"停车场已满,请车辆进入便道等候"<<endl;
inputshortpark(cartemp,realtime);//这里调用便道程序
return true;
}
top++;
data[top].num=cartemp;
data[top].cartime=realtime;
cout<<"车牌号为"<<data[top].num<<"的车辆进入停车场"<<endl;
//showcar(realtime);
return true;
}
bool park::showcar(int realtime)
{
cout<<"停车场共有"<<top+1<<"辆车辆停放"<<endl;
if((top+1)!=0)
{
for(int i=0;i<top+1;i++)
{
cout<<"第"<<i+1<<"辆"<<"\t"<<"车牌号是:"<<data[i].num<<"\t"<<"停放时间为:"<<realtime-data[i].cartime<<endl;
}
}
cout<<endl;
cout<<"等待区共有"<<shortpsum<<"辆车辆停放"<<endl;//QAQ实在不知道怎么实现车辆的信息打印
return true;
}
bool park::parkcut(int carnum,int realtime)
{
int i;
int tempi;
if(top==-1)
{
cout<<"停车场没有车辆停放,随时可以停车。"<<endl;
return true;
}
for(i=0;i<top+1;i++)
{
if(carnum==data[i].num)
{
cout<<"车牌号为:"<<data[i].num<<"的车辆离开停车场"<<"\t"<<"共花费"<<(realtime-data[i].cartime)*2<<"元"<<endl;
tempi=i;
top--;
}
}
if((top+1)-(i-1)!=0)
{
//剩下的进等待区
//这里加进等待区函数
int temptop=top;
for(int j=i+1;j<temptop;j++)
{
inputwaitspace(data[j]);
top--;
}
top--;
//车辆离开,等待区的车辆进入停车场
for(int j=top;j<temptop-1;j++)
{
//
data[j]=outputwaitspacetemp();
top++;
}
}
return true;
}
int main()
{
int x;
int carnum;//汽车车牌号
static int realtime=0;//初始时间
park T;
while(1)
{
cout<<"\t"<<"【停车场管理系统】"<<endl;
cout<<"请输入菜单进入选项:"<<endl;
cout<<endl;
cout<<"\t"<<"1.有车辆进入停车场停放"<<endl;
cout<<"\t"<<"2.有车辆离开停车场"<<endl;
cout<<"\t"<<"3.模拟完成,退出程序"<<endl;
cin>>x;
switch(x)
{
case 1:
realtime++;
cout<<"\t"<<"请输入进入的车辆信息: "<<endl;
cout<<"\t"<<"请输入6位纯数字车牌号:";
cin>>carnum;
cout<<endl;
T.inputcar(carnum,realtime);//进入程序
T.showcar(realtime);
T.carsum++;
break;
case 2:
//realtime++;
realtime++;
T.showcar(realtime);
if(T.carsum==0)
{
cout<<"停车场没有车辆停放,随时可以停车。"<<endl;
break;
}
cout<<endl;
cout<<endl;
cout<<"\t"<<"请输入离开的车辆信息: "<<endl;
cout<<"\t"<<"请输入6位纯数字车牌号:";
cin>>carnum;
cout<<endl;
T.parkcut(carnum,realtime);
T.carsum--;
break;
case 3:
exit(0);
}
}
cout<<"成功退出";
return 0;
}