数据结构 实验2 停车场问题Word格式文档下载.docx
- 文档编号:15246731
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:13
- 大小:69.41KB
数据结构 实验2 停车场问题Word格式文档下载.docx
《数据结构 实验2 停车场问题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构 实验2 停车场问题Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
2)停入便道:
停车场已满,车牌号为x的汽车位于便道位置y
3)移动停车位置:
车牌号为x的汽车停在停车场位置y
4)离开车辆信息:
车牌号为x的汽车离开,停车时间y小时,缴费z元
3.功能:
根据用户输入数据,若是车辆到达,则输出汽车在停车场内或便道上的停车位置;
若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用。
4.测试数据
停车场系统容量为2
收费标准:
每小时5元
输入:
A15
输出:
车牌号为1的汽车到达,位于停车场位置1
A210
输出格式:
车牌号为2的汽车到达,位于停车场位置2
A320
停车场已满,车牌号为3的汽车位于便道位置1
D115
车牌号为1的汽车离开,停车时间10小时,缴费50元。
车牌号为3的汽车到达停车场,位于位置2
E00
二、概要设计
抽象数据类型
根据题目设计要求,车辆只能从一个大门出入,汽车只能从停车场唯一一条狭长通道驶入驶出,而暂时停放车辆的便道同理。
每一辆停入停车场或便道的汽车有唯一的前驱和后继,所以问题适合建立一个线性数据关系求解。
因为停车场具有只有一个出入口、容量限定的特点,所以实现停车场的线性结构需要具备可限定空间大小,“先进后出”,只有一端出入口的特性,所以用堆栈实现它。
而临时车道停放车辆后要按原序停放回停车场,具有“先进后出”的特点,且需要的临时车道的容量小于等于停车场容量,所以用实现停车场的同一堆栈实现它。
停车便道具有“先进先出”的特点,且需要停车便道的长度不可预测,所以使用链式队列实现。
由于每辆汽车都包含车牌号、停放时间的信息,所以定义一个汽车类为每辆汽车打包这些信息。
classcar//car类
{
public:
intnum;
//车牌号码
inttime;
//汽车停放时间
};
堆栈ADT定义:
数据对象:
car类
数据关系:
R={<
ai-1,ai>
|ai-1,ai∈car,i=1,2,3….n}
约定an为栈顶,a1为栈底。
Stack();
//结构初始化操作
boolpush(constcar&
it);
//压入一个数据
boolpop(car&
//依次弹出m个数据
booltopValue(car&
//获取栈顶元素
~Stack();
//结构销毁操作
intlength()const;
//获取栈的长度
队列ADT定义:
约定a1为队列头,an为队列尾。
Queue();
//队列结构初始化
~Queue();
//数据入列
//数据出列
virtualintlength()const;
//获取队列长度
算法的基本思想
1)如果有一辆车要停入,先判断停车场是否已满。
若未满,把汽车停入停车场(入栈),记录下汽车的车牌号和停放时间。
若已满,把汽车停入便道(入队列)中,记录汽车车牌号,并提示输出停放位置。
2)如果一辆车要离开,用该车车牌号查找停车场中的车,如果不是所查找的车,把此车驶出停车场(出栈),停入临时车道中(入临时栈),直到查找到该车为止。
若查找到,把此车驶出停车场,记录汽车驶离时间,计算停车费用。
汽车离开后把临时车道中的汽车依次驶出(出临时找),并停入停车场中(入栈)。
最后判断便道内是否停有汽车,如果有,把便道中的第一辆车驶出(出队列)停放到停车场(入栈)内,记录停放时间为汽车驶离时间。
程序的流程
(1)输入模块:
输入一组包含汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻的数据。
(2)判断模块:
判断汽车是“到达”或“离开”,若为“到达”执行第(3)1)步,若为“离开”执行第(3)2)步。
(若为‘结束’则停止程序。
)
(3)处理模块:
1)汽车“到达”:
把汽车包含的信息存入栈中,如果入栈失败,则存入队列中。
返回第
(1)步。
2)汽车“离开”:
根据要离开汽车的车牌号对栈中数据判断,不是寻找的数据则出栈存入临时栈中。
找到数据则返回其时间信息并弹出该数据,再判断队列中是否有数据,有则把队列头的数据弹出,压入栈中。
(4)输出模块:
根据时间信息计算停车费用输出到屏幕,并返回第
(1)步。
三、详细设计
根据题目需求,用堆栈实现停车场和临时车道,为了有更高的空间效率和节省结构性开销,用顺序表实现堆栈,链式队列实现便道
物理数据类型
用字符变量存储用户输入“来去”信息,用car类存储汽车车牌号、来去时间。
classcar
public:
intnum;
inttime;
停车场和临时车道的堆栈基本操作如下:
classStack
private:
intsize;
inttop;
car*data;
Stack(){//结构初始化操作
size=n;
top=0;
data=newcar[n];
}
~Stack(){//结构销毁操作
delete[]data;
//压入数据,成功返回true,失败返回false
boolpush(constcar&
it){
if(top==size)returnfalse;
else{
data[top++]=it;
returntrue;
}
//弹出数据,成功返回true,失败返回false
boolpop(car&
if(top==0)returnfalse;
else{it=data[--top];
//获取栈顶元素,获取成功返回true,失败返回false
booltopValue(car&
it)const{
else{
it=data[top-1];
intlength()const{returntop;
}//获取栈的长度
用于便道的链式队列实现如下:
classqnode//定义单链表的结点
carelem;
qnode*next;
qnode(constcar&
elemval,qnode*nextval=NULL)
{
elem=elemval;
next=nextval;
qnode(qnode*nextval=NULL)
classQueue
qnode*front;
qnode*rear;
Queue(){//队列结构初始化
size=0;
front=NULL;
rear=NULL;
~Queue(){//结构销毁操作
while(front!
=NULL){
rear=front;
front=front->
next;
deleterear;
rear=NULL;
size=0;
}
//数据入列,成功返回true,失败返回
if(rear==NULL)
front=rear=newqnode(it,NULL);
else//append
rear->
next=newqnode(it,NULL);
rear=rear->
size++;
//数据出列,成功返回true,失败返回
it)
if(length()==0)returnfalse;
it=front->
elem;
qnode*ltemp=front;
front=front->
deleteltemp;
if(front==NULL)rear=NULL;
size--;
intlength()const
{returnsize;
算法的具体步骤
停车场问题中各部分调用的流程图如下:
//定义使用到的变量
charcomego;
carCar;
Stackpark;
Stacktemp;
Queuepath;
cout<
<
"
停车场系统容量为2"
endl;
//停车场容量、收费标准提示信息
收费标准:
每小时5元"
//提示输入
carc;
while(comego!
='
E'
||comego!
e'
)//如果输入不为’E’或’e’时,进入循环
switch(comego)
{
case'
a'
:
//如果输入字符为’a’或’A’,进行车辆到达相关操作
A'
//在基本操作中定义push()为bool型函数,当栈不满时压栈成功返回true,否则返回false,所以用压栈操作park.push()作为入栈成功与否的判断条件
if(park.push(Car))//如果入栈成功
//输出停车车牌号和位于停车场的位置
else//入栈失败
{
path.push(Car);
//输出停车车牌号和位于便道的位置
break;
D'
//如果输入字符为’d’或’D’
d'
park.topValue(c);
//如果车辆离开,在停车场中查找离开车辆的车牌号,当车牌号相等时,表明在停车场中找到该车
//若所查找的车辆不为离开车辆,则把该车先压入临时栈中,并取得停车场下一车辆车牌号待查
while(c.num!
=Car.num)
{
park.pop(c);
temp.push(c);
park.topValue(c);
}
//找到该车,获得车辆数据
park.pop(c);
EndTime=Car.time;
//车辆离开时间为结束时间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验2 停车场问题 实验 停车场 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)