《 数 据 结 构 》
课 程 设 计 报 告
(2019—2020 学年第一学期)
题 目____ 停车场管理
学生姓名______ __ _
专业班级___ ____ ___
学生学号_______
教师姓名_____ ______
成 绩:
评 语:
教师签名:
日期:2020 年 1 月 5 日
目录
目录 .......................................................................................................................................................
1 需求分析 ............................................................................................................................................
1.1 问题描述...........................................................................................................................
1.2 问题要求...........................................................................................................................
1.3 设计思路...........................................................................................................................
2 详细设计 ............................................................................................................................................
2.1 抽象数据类型定义............................................................................................................
2.2 存储结构设计....................................................................................................................
2.3 算法设计............................................................................................................................
2.3 功能模块设计....................................................................................................................
3 代码实现 ............................................................................................................................................
3.1 函数清单...........................................................................................................................
3.2 主要函数...........................................................................................................................
3.3 主要函数分析....................................................................................................................
4 运行与测试................................................................................................................................... 13
5 总结 ................................................................................................................................................14
6.附录(代码) ............................................................................................................................... 15
1 需求分析
1.1 问题描述
设停车场是一个可以停放 n 辆汽车的南北方向的狭长通道,且只有一个大门
可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列
(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满
n 辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上
的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先
退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆
停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车
场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置
(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停
留的时间。
1.2 问题要求
要求设计并编写一程序,选择适当的数据结构,解决上述问题,要求
(1)输入输出界面友好;
(2)程序可读性强;
(3)程序具有较强的健壮性;
(4)程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离
开停车场时应缴纳的费用和它在停车场内停留的时间。
1.3 设计思路
由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须
先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先
进后出”的操作特点,因此,可以用一个栈来模拟停车场。而当停车场满后,继续来到的其
它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合
队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。排在停车
场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先
离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设
1
的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先
退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。因此,
本题求解过程中需用到两个栈和一个队列。栈以顺序结构实现,队列以链表结构实现。
2
2 详细设计
2.1 抽象数据类型定义
ADT Stack{
数据对象:D={a_i|a_i∈ElemSet,i=1,2,…,n,n>=0}
数据关系:R={
| a_i-1,a_i∈D,i=2,…,n}
约定 a_n 端为栈顶,a_1 端为栈底。
基本操作:
InitStack(SqStack &S)
Push(SqStack &S,ElemType e)
初始条件:栈 S 已存在并且未满。
操作结果:插入元素 e 为新的栈顶元素。
Pop(SqStack &S,ElemType &e)
初始条件:栈 S 已存在并且非空。
操作结果:删除 S 的栈顶元素,并用 e 返回其值。
}ADT Stack
ADT Queue {
数据对象:D={a_i | a_i∈ElemSet,i=1,2,…,n,n>=0}
数据关系:R={ | a_i-1,a_i∈D,i=2,…,n}
约定 a_1 端为队列头,a_n 端为队列尾。
基本操作:
InitQueue(LinkQueue &Q)
操作结果:构造一个空队列 Q。
EnQueue(LinkQueue &Q,ElemType e)
初始条件:队列 Q 已存在。
操作结果:插入元素 e 为 Q 的新队尾元素。
DeQueue(LinkQueue &Q,ElemType &e)
初始条件:Q 为非空队列。
操作结果:删除 Q 的队头元素,并用 e 返回其值。
QueueEmpty(LinkQueue Q)
初始条件:队列 Q 已存在。
操作结果:若 Q 为空队列,则返回 True,否则返回 False。
}ADT Queue
3
2.2 存储结构设计
本程序中停车场和临时停车场符合栈的“后进先出,先进后出”的操作特点,并
且有大小限制,因此顺序栈模拟,而便道符合队列的“先进先出,后进后出”的操作特点,
因此用链表队列模拟.
2.3 算法设计
首先,通过对顺序栈的大小定义,确定停车场的大小.
当有车要停入停车场时,首先判断停车场是否已满,如果未满,则直接驶入
停车场,系统开始计时停车时间。如果停车场已满,则驶入停车便道等待。
当有车要驶出停车场时,从栈首将车辆弹出,并将其车牌号与需驶出车辆进
行比对。如果弹出的车辆与要驶出车辆的车牌号一致,则该车直接驶出停车场,
系统停止记录停车时间,并且输出该车停车时长和停车费,然后检测临时停车场
是否停有汽车,若有,则临时停车场中的所有车辆按照原来顺序重新驶入停车库,
随后检测停车便道中是否停有车辆,若有,则便道中的第一辆车可以驶入停车场;
如果系统检测到驶出车辆与要驶出的车辆不一致时,则该车直接驶入临时停车场;
如果在停车场内未找到需要驶出的车辆,则系统返回查无此车,并将临时停车场
中的所有车辆按照停车场中的顺序重新驶入停车场。
程序流程图表示如下(见下页):
4
5
2.3 功能模块设计
本系统共拥有三个功能模块.
(1) 车辆驶入功能模块
在有车辆需要进入停车场时,调用此模块.本模块将对停车场的状态
进行判断,如果停车场未满,则车辆驶入停车场,若停车场已满,则车辆驶入
便道.
(2) 车辆驶出模块
在有车辆驶出停车场时,输入当前车辆车牌号即可输出车辆停放时间
及停车费,如果车牌号输入错误,停车场中没有此车,则输出”停车场中无
此车”提示用户重新输入.
(3) 程序终止模块
用户调用此模块则直接终止程序.
6