经济管理学院本科课程设计论文 开始 初始化两个栈Enter和Temp及一个队列进入主菜车到达 车离开 列表显退出 是 车场是否否 车场内信便道车信退出列表显示 Room前车辆进临对room否 判断栈是否为否 元素进栈Enter 判便道是否有是 是 元素进队列便道车进栈Enter元素队列中元素进队列Wait中元素出结束
图2-1 算法流程图
- 12 -
第2章 停车场管理问
2.4算法基本思想描述
由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,我设计用顺序存储结构来存储停车场内的车辆信息,并给车辆按进栈顺序编号,当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车。当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素设计成汽车的车牌号,并以链表的形式存储。另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间和车辆离开停车场时的时间,然后计算、显示费用情况。
2.5概要设计
2.5.1栈的抽象数据类型
ADT stack{
数据对象:D={aiai∈charset,I=1,2,??,n,n=0} 数据关系:R1={ai-1,aiai-1,ai∈D,I=2??,n} 基本操作: Initstack(&S)
操作结果:构造一个空栈S。
- 13 -
经济管理学院本科课程设计论文 DestroyStack(&S)
初始条件:栈S已经存在。 操作结果:操作结果:销毁栈S。 ClaerStack(&S)
初始条件:栈S已经存在。 操作结果:将S清空为空栈。 StackLength(&S)
初始条件:栈S已经存在。 操作结果:返回栈S的长度。 StackEmpty(&S)
初始条件:栈S已经存在。
操作结果:若S为空栈,则返回TURE,否则返回FALSE。 GetTop(S,&e)
初始条件:栈S已经存在。
操作结果:若栈S不空,则以e返回栈顶元素。 Push(&S,e)
初始条件:栈S已经存在。
操作结果:在栈S的栈顶插入新的栈顶元素e。 Pop(&S,&e)
初始条件:栈S已经存在。
操作结果:删除S的栈顶元素,并以e返回其值。 StackTraverse(S,visit()) 初始条件:栈S已经存在。
操作结果:从栈底到栈顶依次对S中的每个元素调用函数visit( )。 }ADT stack
2.5.2链式队列的抽象数据类型
typedef struct Qnode{ QelemType data; Struct Qnode next; }Qnode,QueuePtr;
- 14 -
第2章 停车场管理问 typedef struct{
QueuePtr front; 队头指针 QueuePtr rear; 队尾指针 ADT Queue{
数据对象:D={aiai∈ElemSet,i=1,2,??,n,n=0} 数据关系:R1={ai-1,aiai-1,ai∈D,i=2,??,n} 约定中端为队列头,后端为队列尾。 基本操作: InitQueue(&Q)
操作结果:构造一个空队列Q。 DestroyQueue(&Q)
初始条件:队列Q已经存在。
操作结果:队列Q被销毁,不再存在。 ClearQueue(&Q)
初始条件:队列Q已经存在。 操作结果:将Q清为空队列。 QueueEmpty(Q)
初始条件:队列Q已经存在。
操作结果:若Q为空队列,则返回TRUE,否则FALSE。 QueueLength(Q)
初始条件:队列Q已经存在。
操作结果:返回Q的元素个数,即队列的长度。 GetHead(Q,&e)
初始条件:Q为非空队列。 操作结果:用e返回的e队头元素。 EnQueue(&Q,e)
初始条件:队列Q已经存在。
操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q,&e)
初始条件:Q为非空队列。
操作结果:删除Q的队头元素,并用e返回其值。 QueueTraverse(Q,visit()) 初始条件:Q已经存在且非空。
- 15 -
经济管理学院本科课程设计论文 操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。 }ADT Queue
2.6模块划分
2.6.1主程序模块
main(){
初始化
while(重复条件){ 接受命令;
switch(调用条件) {
Case调用条件’A’ 到达处理;break; Case调用条件’D’ 离开处理;break; Case调用条件’E’ 退出处理; }
} }
2.6.2 两个栈模块
实现栈抽象数据类型:
数据对象:D={aiai∈charset,I=1,2,??,n,n=0}
数据关系:R1={ai-1,aiai-1,ai∈D,I=2??,n}
- 16 -