1、P) 操作结果:构造一个空栈P。Push( &P, e) 初始条件:栈P已经存在在栈的栈顶插入新的栈顶元素e。Pop( &P,Car&e)删除P的栈顶元素,并以e返回其值。 ADT Stack;2、设定队列的抽象数据类型定义为:ADT QueueD=ai|aiShortcut, i=1,2,n,nInitQueue(&S)构造一个空队列SEnQueue( &S, *number,ar_time) 队列S已经存在插入元素e为S新的队尾元素DeQueue( &S, &w) 删除队列的队头元素w ADT Queue;3.本程序包括四个模块1)主程序模块Void main()声明定义调用栈与队列的函数
2、主信息(输入初始操作信息)2)栈模块-实现栈抽象数据类型3)队列模块-实现队列抽象数据类型4)结构体模块-用于对对象及变量的管理各模块之间的调用关系如下: 主程序模块 结构体模块 栈模块 队列模块 4.设计停车管理程序的要求按照从终端读入的输入数据进行模拟管理,每一组输入数据包括三个数据项:汽车“进站”或“出站”信息、汽车牌照号码以及进站或出站的时刻,对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内逗留的时间和应交纳的费用(在便道上停留不收费),按以顺序结构实现,队列以链表结构实现。三、 详细设计1、 结点类型及部
3、分数据定义a、停车场的车typedef struct Car1 char number20; /汽车车牌号 int ar_time; /汽车到达时间CarNode;b、停车场typedef struct CarNode *base; /停车场的堆栈底 CarNode *top; /停车场的堆栈顶 int stacksize;Park;c、便道上的车typedef struct Car2 struct Car2 *next;*CarPtr;d、便道 typedef struct CarPtr front; /便道的队列的队头 CarPtr rear; /便道的队列的队尾 int length;S
4、hortcut;2、 主函数和其他函数的算法分析 Status Arrival(Park &P,Shortcut & /对进站车辆的处理,若停车场不满,对进站车辆,输入车牌号及进站 /时刻,并显示出其所在的车道,若停车场满,将其停在便道上(不计费) Status Leave(Park &P,Park &Q,Shortcut & /对离站车辆的处理,输入车牌号,显示出场时刻,并计算费用,若便 /道上有车,将其移到停车场并开始计时四、 调试分析1、在调用栈与队列的函数时遇到一些问题,比如我想通过键盘输入来确定停车场的停车数,所以初始化时那些操作函数必须带有停车数这个参数。2、在设计Leave函数时
5、,我想设计两个形参,但调试后总出现错误。3、刚开始设计的程序输入车牌号时只能是整型,后来改了一下,使得输入的车牌号为字符串型。4、在本程序中,时间只能是整点,可以将时间设计一个结构体,由于时间原因,在本程序中没有进行改进。五、用户手册1、本程序的运行环境为DOS操作系统,执行文件为:停车场管理系统.exe。2、进入演示程序后即显示文本方式的用户界面:3、看到“请选择您要进行的操作(A,D,E):”提示后,按提示依次输入车辆信息,按回车键结束。4、接受其他命令后即执行相应运算和显示相应结果,在此不再一一演示。六、测试结果1、车辆进站:车牌号 w34 进站时刻 4 输出如下:当停车场满时,输出如下
6、: 3、 车辆出站 车牌号:w34附录源程序:/头文件#includestdlib.hmalloc.hstring.h/函数返回状态代码#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define INFEASIBLE -1#define OVERFLOW -2#define SIZE 2/停车场位置数typedef int Status;/栈,模拟停车场typedef struct Car1 /停车场的车 char number20; int ar_time;typedef struct /停车场 CarNode *base;
7、 CarNode *top; int stacksize;/队列,模拟便道,以链表形式实现typedef struct Car2 /便道上的车 struct Car2 *next;typedef struct /便道 CarPtr front; CarPtr rear; int length;Status InitStack(Park &P) /初始化停车场 P.base=(CarNode*)malloc(SIZE*sizeof(Car1); if(!P.base) exit(OVERFLOW); P.top=P.base; P.stacksize=0; return OK;Status Pu
8、sh(Park &P,CarNode e) /车进入停车场 *P.top+=e; +P.stacksize;Status Pop(Park &P,CarNode &e) /车离开停车场 if(P.top=P.base) return ERROR; else e=*(-P.top); -P.stacksize; Status InitQueue(Shortcut &S) /初始化便道 S.front=S.rear=(CarPtr)malloc(sizeof(Car2);S.front | !S.rear) S.front-next=NULL; S.length=0;Status EnQueue(
9、Shortcut &S,char *number,int ar_time) /车进入便道 CarPtr p; p=(CarPtr)malloc(sizeof(Car2);p) strcpy(p-number,number); p-ar_time=ar_time; S.rear-next=p; S.rear=p; +S.length;Status DeQueue(Shortcut &S,CarPtr &w) /车离开便道 if(S.length = 0) w = S.front-next;next=S.front-next- -S.length;Status Arrival(Park &S) /
10、对进站车辆的处理 printf(请输入车牌号:); scanf(%s,number);进场的时刻:%d,&ar_time); if(P.stacksize SIZE) CarNode c; strcpy(c.number,number); c.ar_time=ar_time; Push(P,c);该车应停在第%d号车道!n,P.stacksize); EnQueue(S,number,ar_time);停车场已满,请暂时停在便道的第%d个位置!,S.length);Status Leave(Park &S) /对离站车辆的处理 int le_time,flag=1,fee,ar_time; /getchar();出场的时刻:le_time); CarNode e,m; CarPtr w; while(P.stacksize) Pop(P,e); if(strcmp(e.number,number)=NULL) flag=0; fee=(le_time-e.ar_time)*2; /计算费用 ar_time=e.ar_time; break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1