一、 实验目的
进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。
二、 实验问题描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。试用停车场编制按上述要求进行管理的模拟程序
三、 实验步骤
1、 实验问题分析
由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,又每个汽车的车牌号都不一样,这样一来可以根据车牌号准确找到汽车位置,所以堆栈里的数据元素我设计成汽车的车牌号。当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车车牌号。当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间,车辆离开停车场时的时间不需要记录,当从终端输入时可直接使用。由于时间不象汽车一样需要让道,我设计了一个顺序表来存放时间。又用顺序表用派生法设计了一个堆栈,恰好满足上面模拟停车场的需要。
2、功能函数设计
1.程序功能介绍各操作提示模块:此模块给出程序欢迎信息。介绍本程序的功能,并给出程序民对应的键盘操作的提示。函数原型为:void welcome()//显示欢迎信息
2.汽车进入停车位的管理模块:此模块用来登记停车厂的汽车车牌号和对该车的调度过程并修改该车的状态,其中调试过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调试。
此函数的原型为:void come(stopstack *s,pavment *p,carnode x)//处理车辆到达的情况
3.汽车离开停车位的管理模块:提出离开停车厂的车辆做调试处理,并修改相关车辆的状态,其中调试过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调度,当有车离开停车厂后应该立刻检查便道上是否有车,如果有车立即让便道上的车第一辆汽车进入停车位。
函数原型为:void leave(stopstack *s,stopstack *l,pavment *p,carnode x)// 处理车辆离开的情况
4.查看停车厂停车状态的查询模块:此模块用来在屏幕上显示停车位和便道上各位置的状态。
函数原型为:void display(stopstack *s,pavment *p)//显示车辆在车场和便道的状态
四、实验结果(程序)及分析
1、实验主要模块代码
string sto="在车场内",com="来车了",lea="车要出站",out="离开车场",pavout="在便道外",pavin="在便道上",patostop="由便道进入车站";//定义了全局变量,用来代表车辆的各个状态
void welcome(){
cout<<" "<<"***欢迎使用本程序***"<<endl;
cout<<"本程序为停车场的模拟管理程序,有车到来时请按“D”键"<<endl;
cout<<"然后根据屏幕提示进行相关操作,有车要走时请按“L”键"<<endl;
cout<<"然后根据屏幕提示进行相关操作,要显示车位请按“M”键"<<endl;
cout<<"然后根据屏幕提示进行相关操作,要退出程序请按“Q”键"<<endl;
}//显示WELCOME MESSAGE
void come(stopstack *s,pavment *p,carnode x){//处理车辆到达的情况
int f;f=push(s,x);//车辆进站
if(f==0){
inpavment(p,x.licese);
cout<<"车牌号"<<x.licese<<""t"<<"的车"<<p->front->state<<endl;}//车辆进入便道
}
-------------------------------------------------------------------------------------
int leave(stopstack *s,stopstack *l,pavment *p,carnode x){
carnode y;
string a;
while(s->top>-1){int i;int j;
for(i=0;i<=s->top;i++){
if(s->stop[i].licese==x.licese)
a=s->stop[i].licese;//判断此车是否在车站内
j=i;}
while(a==x.licese){
int k=s->top;
if(j==s->top){
pop(s);}//如果此车恰为最后一辆则出栈
while(k>j){
y=pop(s);
push(l,y);
cout<<y.licese<<"的车进入辅助栈"<<endl;k--;}//如果此车不是s->top则到它后边的车全部进入辅助
栈后再出站
y=pop(s);}
}
while(l->top>-1){//如果便道有车那么便道的车进入车站
y=pop(l);
push(s,y);
a=popPav(p);
y.licese=a;
push(s,y);
p->front->next;
}
return 1;}
------------------------------------------------------------------------------------------
void display(stopstack *s,pavment *p){//显示车场和便道上的车辆状态
if(s->size==0&&p->front==NULL) exit(1);
else{
cout<<"车场内的车为:"<<endl;
int i;
for(i=0;i<s->top;i++)
cout<<s->stop[i].licese<<"车停在第"<<i<<"位"<<s->stop[i].state<<endl;
cout<<"便道上的车为:"<<endl;
do{ cout<<"车号为"<<p->front->licese<<"的车"<<p->front->state<<endl;
p->front->next; }while(p->rear!=NULL); }
}
2、 测试数据
***欢迎使用本程序***
本程序为停车场的模拟管理程序,有车到来时请按“D”键
然后根据屏幕提示进行相关操作,有车要走时请按“L”键
然后根据屏幕提示进行相关操作,要显示车位请按“M”键
然后根据屏幕提示进行相关操作,要退出程序请按“Q”键
d
请输入车的号码:
j1
车号为j1的车在车场
d
请输入车的号码:
j2
车号为j2的车在车场
d
请输入车的号码:
j3
车牌号j3的车在便道上
d
请输入车的号码:
j4
车牌号j4的车在便道上
d
请输入车的号码:
j5
车牌号j5的车在便道上
l
请输入车的号码:
j1
车号为j2的车离开车场
车牌号j3 的车在便道上
车号为j3的车在车场
m
j1车停在第1位在车场
j3车停在第2位在车场
车号为j4在便道外的车在便道外
车号为j5在便道外的车在便道外
d
请输入车的号码:
j6
车牌号j6的车在便道上
d
请输入车的号码:
j7
车牌号j7的车在便道上
l
请输入车的号码:
j3
车号为j3的车离开车场
车牌号j4 的车在便道上
车号为j4的车在车场
3、 调试过程中出现的问题以及解决策略
此程序运用了string,没有采用书上的字符数组,来接收数据。并定义常量来确定车辆的状态。在调试程序的过程中,运用到了栈和链式队列的操作,熟习了程序的过程及调用。通过写这个程序和调试,明确了数据结构中的一些重要概念。
数据类型和数据结构密切相关。数据类型的原子类型和结构类型;为什么要抽象数据类型,就要建立一个数学模型和定义在这个模型上的一组操作。包括书上的一些东西更明白了:抽象数据类型是使用与实现相分离,实行封闭和信息隐蔽。以及数据、操作过程和接口探物,从宏观上把握全局。
此程序在测试过程中,车辆进栈没有出现问题,车辆出栈能够正确显示出车辆的动态过程。
在车辆的显示模块中,能够正确显示车辆的状态。
通过本程序熟练了栈和队列的定义和使用方法,对使用C语言和使用数据结构进行编程思考有了进一步的理解。
通过在设计过程中的思考,对实际生活中的问题进行分析并使用现有知识利用计算机来解决之有了初步的了解,对模块化程序辽宁省了比较清晰的理解,为今后的程序设计奠定了一定的准备。程序中仍然有一些需要完善的地方,例如:程序界面可以使用图形方式使之更美观,
浙公网安备 33010602011771号