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

下载本文档

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

文档简介

HUNAN UNIVERSITY实验二最终报告题 目: 停车场管理 学生姓名 学生学号 专业班级 指导老师 完 成 日 期 2014年4月24日 一、 需求分析1 输入形式:用户通过键盘输入一组数据:字符、整数、整数后,输出汽车到达或者汽车离去的相应信息到DOS界面。当用户输入数据不符合规范时,提示重新输入。输入规则:第一个字符中A表示车辆到达;D表示车辆离去;E表示输入结束;第二个整数代表车牌号码;第三个整数代表到达或离去的时刻。2 输出形式:1) 停入停车场:车牌号为x的汽车到达,位于停车场位置y2) 停入便道:停车场已满,车牌号为x的汽车位于便道位置y3) 移动停车位置:车牌号为x的汽车停在停车场位置y4) 离开车辆信息:车牌号为x的汽车离开,停车时间y小时,缴费z元3 功能:根据用户输入数据,若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用。4 测试数据停车场系统容量为2收费标准:每小时5元输入:A 1 5输出:车牌号为1的汽车到达,位于停车场位置1 输入:A 2 10输出格式:车牌号为2的汽车到达,位于停车场位置2输入:A 3 20输出格式:停车场已满,车牌号为3的汽车位于便道位置1 输入:D 1 15输出格式:车牌号为1的汽车离开,停车时间10小时,缴费50元。输出格式:车牌号为3的汽车到达停车场,位于位置2输入:E 0 0二、概要设计抽象数据类型根据题目设计要求,车辆只能从一个大门出入,汽车只能从停车场唯一一条狭长通道驶入驶出,而暂时停放车辆的便道同理。每一辆停入停车场或便道的汽车有唯一的前驱和后继,所以问题适合建立一个线性数据关系求解。因为停车场具有只有一个出入口、容量限定的特点,所以实现停车场的线性结构需要具备可限定空间大小,“先进后出”,只有一端出入口的特性,所以用堆栈实现它。而临时车道停放车辆后要按原序停放回停车场,具有“先进后出”的特点,且需要的临时车道的容量小于等于停车场容量,所以用实现停车场的同一堆栈实现它。停车便道具有“先进先出”的特点,且需要停车便道的长度不可预测,所以使用链式队列实现。由于每辆汽车都包含车牌号、停放时间的信息,所以定义一个汽车类为每辆汽车打包这些信息。class car /car类 public:int num; /车牌号码int time; /汽车停放时间;堆栈ADT定义:数据对象:car类数据关系:R=|ai-1,aicar,i=1,2,3.n约定an 为栈顶,a1为栈底。Stack(); /结构初始化操作bool push(const car& it); /压入一个数据bool pop(car& it); /依次弹出m个数据bool topValue(car& it); /获取栈顶元素Stack(); /结构销毁操作int length() const; /获取栈的长度队列ADT定义:数据对象:car类数据关系:R=|ai-1,aicar,i=1,2,3.n约定a1 为队列头,an为队列尾。Queue(); /队列结构初始化Queue(); /结构销毁操作bool push(const car& it); /数据入列bool pop(car& it); /数据出列virtual int length() const; /获取队列长度算法的基本思想1) 如果有一辆车要停入,先判断停车场是否已满。若未满,把汽车停入停车场(入栈),记录下汽车的车牌号和停放时间。若已满,把汽车停入便道(入队列)中,记录汽车车牌号,并提示输出停放位置。2) 如果一辆车要离开,用该车车牌号查找停车场中的车,如果不是所查找的车,把此车驶出停车场(出栈),停入临时车道中(入临时栈),直到查找到该车为止。若查找到,把此车驶出停车场,记录汽车驶离时间,计算停车费用。汽车离开后把临时车道中的汽车依次驶出(出临时找),并停入停车场中(入栈)。最后判断便道内是否停有汽车,如果有,把便道中的第一辆车驶出(出队列)停放到停车场(入栈)内,记录停放时间为汽车驶离时间。程序的流程(1) 输入模块:输入一组包含汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻的数据。(2) 判断模块:判断汽车是“到达”或“离开”,若为“到达”执行第(3) 1)步,若为“离开”执行第(3) 2)步。 (若为结束则停止程序。)(3) 处理模块:1) 汽车“到达”:把汽车包含的信息存入栈中,如果入栈失败,则存入队列中。返回第(1)步。2) 汽车“离开”:根据要离开汽车的车牌号对栈中数据判断,不是寻找的数据则出栈存入临时栈中。找到数据则返回其时间信息并弹出该数据,再判断队列中是否有数据,有则把队列头的数据弹出,压入栈中。(4) 输出模块:根据时间信息计算停车费用输出到屏幕,并返回第(1)步。三、详细设计根据题目需求,用堆栈实现停车场和临时车道,为了有更高的空间效率和节省结构性开销,用顺序表实现堆栈,链式队列实现便道物理数据类型用字符变量存储用户输入“来去”信息,用car类存储汽车车牌号、来去时间。class carpublic: int num; int time;停车场和临时车道的堆栈基本操作如下:class Stackprivate:int size;int top;car *data;public:Stack() /结构初始化操作 size=n; top=0; data=new carn;Stack() /结构销毁操作delete data;/压入数据,成功返回true,失败返回falsebool push(const car& it)if(top=size) return false;elsedatatop+=it; return true;/弹出数据,成功返回true,失败返回falsebool pop(car& it)if(top=0) return false;elseit=data-top; return true;/获取栈顶元素,获取成功返回true,失败返回falsebool topValue(car& it) constif(top=0) return false;else it = datatop-1;return true;int length() constreturn top; /获取栈的长度;用于便道的链式队列实现如下:class qnode /定义单链表的结点public:car elem;qnode *next;qnode(const car& elemval,qnode* nextval=NULL)elem=elemval;next=nextval;qnode(qnode* nextval=NULL)next=nextval;class Queueprivate:int size;qnode *front;qnode *next;qnode *rear;car *data;public:Queue() /队列结构初始化size=0;front=NULL; rear=NULL;Queue() /结构销毁操作while(front!=NULL)rear=front;front=front-next;delete rear;rear=NULL;size=0; /数据入列,成功返回true,失败返回bool push(const car& it)if(rear=NULL)front=rear=new qnode(it,NULL); else /appendrear-next=new qnode(it,NULL);rear=rear-next;size+;return true;/数据出列,成功返回true,失败返回bool pop(car& it) if(length()=0) return false; it=front-elem; qnode* ltemp=front; front=front-next; delete ltemp; if(front=NULL) rear=NULL; size-; return true; /获取队列长度int length() const return size; ;算法的具体步骤车辆“离开”处理模块停车场问题中各部分调用的流程图如下:程序结束车辆“到达”处理模块/定义使用到的变量char comego;car Car;Stack park;Stack temp;Queue path;cout停车场系统容量为2endl; /停车场容量、收费标准提示信息cout收费标准:每小时5元=0时不作处理,当time=0) cost=(EndTime-StartTime)*5;else /离开时间小于停车时间,按停车“过夜”计算time=24-StartTime+EndTime;cost=time*5;/输出停车时长和停车费用信息/车辆离开后,把临时车道中的车全部停放回停车场。判断临时栈中是否为空,判断临时栈中数据是否全部压回原栈(停车场)。while(temp.length()!=0)temp.pop(c);park.push(c);park.topValue(c);/输出停车位置更改提示/当车辆全部从临时栈中压回原栈后,原栈中空出一个存储空间,这时判断队列(便道)是否为空来表示是否有元素(汽车)在队列中,如果有则压入原栈中。if(path.length()!=0) /队列不为空path.pop(c);c.time=Car.time;park.push(c);/输出停车车牌和停车位置提示break;case E: /输入E或e,结束程序case e:exit(0);default: /有其他输入时,报错并提示重新输入/报错,提示输入汽车信息break;/提示输入汽车信息算法的时空分析及改进设想 分析可知,当汽车要离开时时间复杂度较汽车进入时的每次压栈和弹栈的基本操作的时间复杂度为(1),且最好情况时间复杂度为(1),最差情况的时间复杂度为(n2)。根据化简原则可知,程序的时间复杂度为(n2)。如果模拟停车场的线性结构用链表实现,那么每一次汽车“进入”或者“离开”停车场的时间复杂度都为(1)。输入和输出的格式输入A 1 1D 2 3E 0 0输出车牌号为x的汽车到达,位于停车场位置y停车场已满,车牌号为x的汽车位于便道位置y车牌号为x的汽车到达停车场,位于位置y车牌号为x的汽车离开,停车时间y小时,缴费z元四、测试数据输入A 1 5A 2 10A 3 20D 1 15D 2 2E 5 35输出车牌号为1的汽车到达,位于停车场位置1车牌号为2的汽车到达,位于停车场位置2停车场已满,车牌号为3的汽车位于便道位置1车牌号为1的汽车离开,停车时间10小时,缴费50元。车牌号为3的汽车到达停车场,位于位置2车牌号为2的汽车离开,停车时间16小时,缴费80元。五、实验心得本次实验已经满足要求,不过作为停车场管理系

温馨提示

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

评论

0/150

提交评论