i-1,a
i
>|a
i-1
a
i
∈D,i=2……,n}
约定其中a
i为队列头,a
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返回Q的对头元素.
EnQueue(&Q,e)
初始条件:
队列Q已存在.
操作结果:
插入元素e为Q新的队尾元素.
DeQueue(&Q,&e)
初始条件:
Q为非空队列.
操作结果:
删除Q的队头元素,并用e返回其值.
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空.
操作结果:
从队头到队尾,依次对Q的每一个数据元素调用函数visit().一旦visit()失败,则操作失败.
}ADTQueue
3.本程序包括四个模块
1)主程序模块
voidmain()
{
声明定义
调用栈与队列的函数
主信息(输入初始操作信息)
}
2)栈模块---实现栈抽象数据类型
3)队列模块---实现队列抽象数据类型
4)结构体模块---用于对对象及变量的管理
各模块之间的调用关系如下:
主程序模块
↓
结构体模块
↓
栈模块
↓
队列模块
4.设计停车管理程序的要求
按照从终端读入的输入数据进行模拟管理,每一组输入数据包括三个数据项:
汽车“进站”或“出站”信息、汽车牌照号码以及进站或出站的时刻,对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内逗留的时间和应交纳的费用(在便道上停留不收费),按以顺序结构实现,队列以链表结构实现。
三.详细设计:
1.时间结点类型
typedefstructtime{
inthour;
intmin;
}Time;/*时间结点*/
2.车辆进出站信息类型
typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}CarNode;/*车辆信息结点*/
3.停车场和便道信息类型
typedefstructNODE{
CarNode*stack[Max+1];
inttop;
}SeqStackCar;/*模拟车站*/
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
voidInitStack(SeqStackCar*,intn);/*声明栈*/
//初始化,创建两个新栈S,S1
intInitQueue(LinkQueueCar*);/*声明便道*/
//初始化,创建一个队列Q用于便道
intArrival(SeqStackCar*,LinkQueueCar*,intn);/*车辆进站*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn);/*车辆出站*/
voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/
voidInitStack(SeqStackCar*s,intn)/*初始化栈*/
4.主函数和其它函数的伪码算法
voidmain()
{//主程序
initialization();//初始化
while
(1){
scanf(...................);//根据提示信息输入想要的操作
switch(k){//根据输入的数调用不同的函数
case1:
case2:
....................
}
}
}
typedefstruct**{
//用于创建不同结构体类型的指针与变量
}
voidprint(CarNode*p){
//调用输出函数
Leave(*p,n)...................
根据求解时间值来求得费用,并通过收据打印出来
}
5.主要函数思想
本程序是个简单的栈与队列的应用程序,其所用的函数也是栈与队列的基本函数,但在
编写函数时应特别注意它的面向对象性与窗口化设计,切身为使用者着想.所以在运用
一些函数时调用的基本语句有太多的重复,其目的在于实现它本来的基本目的.
四.调试分析:
1.本次作业只是栈与队列的复习应用,所以总的调试比较顺利,只是在调用栈与队列的函数时遇到一些问题,比如我想通过键盘输入来确定停车场的停车数,所以初始化时那些操作函数必须带有停车数这个参数。
2.在定义栈的元素最大空间时如果使用顺序栈必须先给它赋初值,但如果通过链表就可以实现动态分配内存,为栈动态开辟新空间。
3.在判断键盘输入是否符合要求时,如果不符合要求应循环赋值,直到符合要求为止,在此利用的do-while循环语句与外部while语句套用时应使用两次break语句,才能跳出循环,否则会
造成死循环。
4.经验体会:
通过DEBUG调试器和数据观察窗口,可以加快找到程序中的疵点。
五.软件使用说明书:
本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建立和更新的存车费用信息保存于文件输出或打印。
对于查找等功能能够按存车位置及车牌号分别进行。
每辆车的相关信息包括:
车牌号,进站时间,出站时间,存车位置,停车费用等。
本系统功能还需完善,操作简单,只是供学习之用,并不能作为实际生活使用。
下面介绍了此软件的使用说明:
1.停车场.exe;
2.进入演示系统后首先是一个用户及管理员使用注意事项界面,进入后会出现菜单选项。
1.车辆进站
2.车辆出站
3.存车信息
4.离开系统
请选择:
1|2|3|4.
这时可按照提示进行你想要的操作。
3.对于1-4的具体操作与内容请详见前面的调试分析,您便可以轻松操作了!
六.总结:
经过这次课程设计,通过对程序的编制,调试和运行,使我更好的掌握了栈和队列基本性质和有关它们之间关系使用问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。
这次数据结构的程序设计,对于我来说是一个挑战。
我对数据结构的学习在程序的设计中也有所体现。
课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
七.附录
所用到的库函数:
Stdio.h/*标准输入/输出头文件*/
String.h/*包含字符串处理函数头文件*/
Stdlib.h/*包含动态存储与释放函数头文件*/
malloc.h/*包含内存分配头文件*/
源代码
/*停车场管理系统*/
#include
#include
#include
#include
/*-------------------------------------------------------------------------
-----*/
#defineMax10
intgetn()
{
intn;
printf("欢迎光临停车场,");
printf("本停车场管理实行24小时制,停车每分钟0.1元.\n");
printf("请输入停车场可容纳的车(最多10辆):
");
scanf("%d",&n);