数据结构报告 停车场问题.doc_第1页
数据结构报告 停车场问题.doc_第2页
数据结构报告 停车场问题.doc_第3页
数据结构报告 停车场问题.doc_第4页
数据结构报告 停车场问题.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

问题描述:停车场管理问题问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。实现要求 要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。实现提示 汽车的模拟输入信息格式可以是:(到达离去,汽车牌照号码,到达离去的时刻)。例如,(a,1,5)表示1号牌照车在5这个时刻到达,而(d,5,20)表示5号牌照车在20这个时刻离去。整个程序可以在输入信息为(e,0,0)时结束。本题可用栈和队列来实现。 设计: 数据结构设计和核心算法设计描述;停车场管理系统是充分利用数据结构中栈和队列的思想实现的,栈是一种只能在叫做栈的一段进行进栈或者出栈操作的线性数据结构。栈的主要特点是”后进先出”,即后进栈的元素先处理。停车场的容量即为栈的存储空间,停车场的车辆的停靠是无秩序的,因此采用链式存储的方式更适合,也方便车辆的调度。队列是限定仅能在表的一端进行插入,在表的另一端进行删除的线性表。队列中可以插入的一端称为队尾,可以删除的一端称为队首。把一个元素插入队列中的操作为进队,队列中删除一个元素的操作为出队。队列存取操作符合:先进先出。停车场的车辆到达停车和车辆的离开的管理方式就是采用队列的“先进先出”的移动的思想。停车场的入口就是队列的队首,停车场的出口就是队列的队尾。 主控及功能模块层次结构;2.1设定栈的抽象数据类型定义为:adt stack数据对象:d=ai|aicharset, i=1,2,n,n0数据关系:r1=|ai-1,aid,i=2,n基本操作:initstack(&s, n)操作结果:构造一个空栈s,该栈可存放n个元素。push(&s, e)初始条件:栈s已存在。操作结果:在栈s的栈顶插入新的栈顶元素e。pop(&s, &e)初始条件:栈s已存在。操作结果:删除s的栈顶元素,并以e返回其值。destroystack(&s)初始条件:栈s已存在。操作结果:销毁栈s。clearstack(&s)初始条件:栈s已存在。操作结果:将s清为空栈。stacklength(&s)初始条件:栈s已存在。操作结果:返回栈s的长度。stackempty(&s)初始条件:栈s已存在。操作结果:若s为空栈,则返回true,否则返回false。gettop(s, &e)初始条件:栈s已存在。操作结果:若栈s不空,则以e返回栈顶元素。stacktraverse(s, visit()初始条件:栈s已存在。操作结果:从栈底到栈顶依次对s中的每个元素调用函数visit()。adt stack2.2 设定队列的抽象数据类型定义为:adt queue数据对象:d=ai|aielemset, i=1,2,n,n0数据关系:r1=|ai-1,aid,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返回q的队头元素。enqueue(&q, e)初始条件:队列q已存在。操作结果:插入元素e为q的新的队尾元素。dequeue(&q, &e)初始条件:q为非空队列。操作结果:删除q的队头元素,并用e返回其值。queuetraverse(q, visit()初始条件:q已存在且非空。操作结果:从队头到队尾,依次对q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。adt queue2.3详细设计车辆信息类型typedef struct nodeint passport; /存储车辆牌照信息int time; /存储进场时间信息node;2栈类型(停车场)typedef struct stack /定义停车场栈类型node *base;node *top;int stacksize;stack;void initstack(stack &s,int n) /构造空栈s.base=(node *)malloc(n*sizeof(node);s.top=s.base;s.stacksize=n;void push(stack &s,node e) /入栈函数if(s.top-s.base)=s.stacksize)enqueue(q,e); /如果栈满则调用入队函数else s.top-passport=e.passport;s.top-time=e.time;s.top+;void wait(stack &s)if(s.top-s.base)=(s.stacksize-1)&count!=0)node temp;dequeue(q,temp);temp.time=times;push(s,temp);int pop(stack &s,node &e) /出栈函数if(s.top=s.base)return error; /如果栈空则返回error-s.top;e.passport=s.top-passport;e.time=s.top-time;return ok;3队列类型(便道)typedef struct qnode /定义便道队列类型node qdata;struct qnode *next;qnode;typedef struct qnode *front;qnode *rear;linkqueue;void enqueue(linkqueue &q,node e) /入队函数qnode *q;q=(qnode *)malloc(sizeof(qnode);q-qdata.passport=e.passport;q-qdata.time=e.time;q-next=null;if(count=0)q.front=q;count+; /若创建节点前队空,头指针指向节点q.rear-next=q;q.rear=q;void dequeue(linkqueue &q,node &e) /出队函数if(q.rear=null)else e.passport=q.front-qdata.passport;e.time=q.front-qdata.time;q.front=q.front-next;if(q.front=null)q.rear=q.front;count=0;4全局变量及编译预处理语句#define error 0#define ok 1#define null 0int count=0; /队列是否为空的标志int times;stack s,temp; /初始化栈linkqueue q; /初始化队列5主函数及其他函数的算法void main()int n,exit;float money;char info;int pass;q.front=null;q.rear=(qnode *)malloc(sizeof(qnode);q.rear-next=q.rear;printf(停车场容量:);scanf(%d,&n);initstack(s,n);initstack(temp,n);printf(停车场费率(元/小时):);scanf(%f,&money);while(exit!=ok)printf(n请选择车辆状态n1到达 2离去 3结束:); getchar();scanf(%c,&info);printf(请输入车辆牌照:);scanf(%d,&pass);if(info=1|info=3)printf(请输入进场时间:);if(info=2)printf(请输入离场时间:);scanf(%d,×);if(info=3)exit=ok;else if(info=1)int i,j;node a;a.passport=pass;a.time=times;push(s,a);for(i=1;inext;j+;printf(停车位置(便道):%dn,j);else if(info=2)node d;int tp,counter=0;docounter+;tp=pop(s,d);while(tp!=error)if(d.passport=pass)float m;m=-(times-d.time)*money;printf(停留时间:%d 需交费:%fn,-(times-d.time)*(-1),m*(-1);while(temp.base!=temp.top)pop(temp,d);push(s,d);wait(s);d.passport=9999;tp=error;elsepush(temp,d);d.passport=0;tp=error;while(d.passport=0|countern);else if(info!=1&info!=2&info!=3) 主要功能模块的输入、处理(算法框架描述)和输出; 功能模块之间的调用与被调用关系等。(1)输入车辆数据:1为到达,2为离去,3为结束程序。(2)接着输入车辆的牌照信息(3)若为到达的车辆,输入进场信息,若为离去的车辆,输入离场信息。(4)若车辆到达,可得到车辆的停放位置信息,若车辆离去,可得到车辆的停放时间(在便道上的停放时间除外),以及应该交纳的费用。(5)本程序不断循环要求输入车辆信息,直到输入的车辆数据为e时,程序结束。 测试: 测试范例,测试结果,测试结果的分析与讨论,测试过程中遇到的主要问题及所采用的解决措施。测试数据:设n=2输入数据:2输出:停车场容量:2停车场费率:6a,1,5 停车位置(停车场内):1a,2,10 停车位置(停车场内):2d,1,15 停留时间:10 需交费:60.00a,3,20 停车位置(停车场内):2a,4,25 停车位置(便道):1a,5,30 停车位置(便道):2d,2,35 停留时间:25 需交费:150.00d,4,40 停留时间:5 需交费:30.00e,0,04. 运行结果(1)进入停车场(2) 离开停车场(3) 等待停车5. 程序源代码#include #include #define error 0#define ok 1#define null 0typedef struct node /定义车辆信息数据结构int passport; /存储车辆牌照信息int time; /存储进场时间信息node;typedef struct stack /定义停车场栈类型node *base;node *top;int stacksize;stack;typedef struct qnode /定义便道队列类型node qdata;struct qnode *next;qnode;typedef struct qnode *front;qnode *rear;linkqueue;int count=0; /队列是否为空的标志int times;stack s,temp; /初始化栈linkqueue q; /初始化队列void initstack(stack &s,int n) /构造空栈s.base=(node *)malloc(n*sizeof(node);s.top=s.base;s.stacksize=n;void enqueue(linkqueue &q,node e); /入队函数void dequeue(linkqueue &q,node &e); /出队函数void push(stack &s,node e) /入栈函数if(s.top-s.base)=s.stacksize)enqueue(q,e); /如果栈满则调用入队函数else s.top-passport=e.passport;s.top-time=e.time;s.top+;int pop(stack &s,node &e) /出栈函数if(s.top=s.base)return error; /如果栈空则返回error-s.top;e.passport=s.top-passport;e.time=s.top-time;return ok;void wait(stack &s)if(s.top-s.base)=(s.stacksize-1)&count!=0)node temp;dequeue(q,temp);temp.time=times;push(s,temp);void enqueue(linkqueue &q,node e) /入队函数qnode *q;q=(qnode *)malloc(sizeof(qnode);q-qdata.passport=e.passport;q-qdata.time=e.time;q-next=null;if(count=0)q.front=q;count+; /若创建节点前队空,头指针指向节点q.rear-next=q;q.rear=q;void dequeue(linkqueue &q,node &e) /出队函数if(q.rear=null)else e.passport=q.front-qdata.passport;e.time=q.front-qdata.time;q.front=q.front-next;if(q.front=null)q.rear=q.front;count=0;void main()int n,exit;float money;char info;int pass;q.front=null;q.rear=(qnode *)malloc(sizeof(qnode);q.rear-next=q.rear;printf(停车场容量:);scanf(%d,&n);initstack(s,n);initstack(temp,n);printf(停车场费率(元/小时):);scanf(%f,&money);while(exit!=ok)printf(n请选择车辆状态n1到达 2离去 3结束:);scanf(%c,&info);printf(请输入车辆牌照:);scanf(%d,&pass);if(info=1|info=3)printf(请输入进场时间:);if(info=2)printf(请输入离场时间:);scanf(%d,×);if(info=3)exit=ok;else if(info=1)int i,j;node a;a.passport=pass;a.time=time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论