logo资料库

用栈及队列模拟停车场管理的实验报告.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
实验报告 题目:模拟停车场管理的问题 一.需求分析 1. 以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列 进行模拟管理。 2. 每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车 牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息 为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆 离去,则输出车辆在停车场内停留的时间和应缴纳的费用(在便道上停留的 时间不收费)。 3. 栈以顺序结构出现,队列以链表结构实现。 二.模块设计 class car class carstack {public: //车的信息类 //栈(停车场的类) carstack();//构造函数,栈的初始化 int empty();//判断栈是否为空 int full();//判断栈是否为满 car *s;//存放 car 类型栈元素的数组初始地址 int top;//栈顶指针 class carqueue //队列(便道的类) {public: carqueue();//构造函数,队列的初始化 int full();//判断队列是否为满 car *front,*rear;//存放 car 类型队列元素的数组初始地址 } } class pakingmanagement //管理停车场的类 {public: int pushstack(carstack &cs,int cnum,double ctime);//入栈,cs 栈内进行 调整,返回栈内位置 void popstack(carstack &cs,int cnum);//出栈,cs 栈内进行调整, //根据车牌号把车弹出栈,将出栈 car 的 number 赋值给 int popstacknumber() //将出栈 car 的 time 赋值给 double popstacktime(),无返回值! int pushqueue(carqueue &cq,int cnum,double ctime);//入队,队内进行 调整,返回队内位置 int popqueue(carqueue &cq);//出队,队内进行调整,返回汽车车牌号 void arrival(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆 到达,
//根据输入的车牌号、到达时间,变更函数参数;并 cout 车位信息 void leave(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆离 开, //根据输入的车牌号找到汽车,并进行出栈操作、出队操作和入栈操作; //并 cout 停留时间和收费情况 void deletequeue(carqueue &cq,int i);//删除 cq 过道中第 i 辆车 int popstacknumber;//专门存放出栈的时候返回的车牌号 double popstacktime;//专门存放出栈的时候返回的时刻 三.详细设计 1. carstack::carstack()//构造函数,栈的初始化 { top=-1; s=new car[Max];//创建 car 类型栈元素的数组 if(s==NULL) { cout<<"栈空间分配不成功!"<
是 car 类型栈元素的数组 return (cs.top+1);//返回栈内位置加 1,即停车场内车位从 1 号开始 } } void parkingmanagement::popstack(carstack &cs,int cnum)//出栈,cs 栈内进行 调整, //根据车牌号把车弹出栈,将出栈 car 的 number 赋值给 int popstacknumber //将出栈 car 的 time 赋值给 double popstacktime,无返回值! { int i; car p; carstack stemp;//定义一个 carstack 类型的临时存放出栈元素的栈 for(i=0; i<=cs.top; i++) if((cs.s[i]).number==cnum) break;//当要出栈的车的车牌号=栈内的车 牌号元素时,跳出循环 p=cs.s[i];//将要出栈的元素赋给 car 类型的 p 存放 while(cs.top>i) stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出栈的元素数组逐个赋 给临时栈 popstacknumber=p.number;// 将 这 个 车 牌 号 信 息 传 给 int popstacknumber() popstacktime=p.time;//将该车的时间信息传给 double popstacktime() cs.top--;//栈顶指针回到原来位置 while(stemp.top>=0) cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//临时栈出栈的元素逐个 赋给原栈,完成先退再进的工作 } int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入队, 队内进行调整,返回队内位置 { car *p,*countp; int count(1);//count 用于记录车在过道上的位置信息,因队列为链式的, 所以进行循环累加 p=new car;//创建一个 car 类型的指针 p->number=cnum; p->time=ctime; p->next=NULL;//首先将指向存放 car 类型元素的数组初始地址置空 if (cq.front==NULL)//第一次入队要判断头结点是否为空 { cq.front=cq.rear=p; } else
{//尾插法插入元素 p->next=(cq.rear)->next; (cq.rear)->next=p; cq.rear=(cq.rear)->next; } countp=(cq.front)->next; while(countp!=NULL) { count++; countp=countp->next; }//count 即车在过道上的位置,【从 1 开始计!!!】 return count; } { } ctime) 息 { 的车牌号 { int parkingmanagement::popqueue(carqueue &cq)//出队,队内进行调整,返回汽 车车牌号 car p; p.number=((cq.front)->next)->number;//cq 队里,从 cq.front 开始指向下一 个元素的车牌号赋给 car 类型的车信息 p.time=((cq.front)->next)->time;//cq 队里,从 cq.front 开始指向下一个元素 的时刻 //赋给 car 类型的车信息 p.next=((cq.front)->next)->next;//cq 队里,从 cq.front 开始指向下一个元素 的指针 //赋给 car 类型的车信息的下一个元素的指针 return p.number; cq.front=(cq.front)->next; void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double //车辆到达,根据输入的车牌号、到达时间,变更函数参数;并 cout 车位信 int pos; if(!(cs.full()))//如果栈未满,车辆停入停车场 { int fl(0),i;//定义一个从 0 开始的标记 fl for(i=0;i<=cs.top;i++) { if(cs.s[i].number==cnum)//如果到达的车的车牌号=栈内已有车辆
fl=1;//fl 记 1 break; } } if(fl==1)//如果到达的车的车牌号!=栈内已有车辆的车牌号 cout<<"输入错误!请重新输入!"<
额"<next; if(p->number==cnum)//在过道中找到要出去的车,则在队列 中删除该 car。 //后面的车辆依然顺序排列,补足空位 位,请自行驶离,无需付费!"<Max) { { } break; } } if(p==NULL) cout<<"您的车不在本停车场内,或输入有误,请重新输入! "<next; j++; }//找到第 i 个节点(i 从 1 开始) if(!p || !p->next) cout<<"i 不合法"; else {
q=p->next; p->next=q->next; delete q; } } 四:函数的调用关系图 main arrival pushstack pushqueue leave popstack pushstack popqueue deletequeue 五:设计和调试分析 1. 2. 3. 本实验内容为停车场的管理系统,其中定义了类 carstack 来模拟停车 场,类 carqueue 来模拟便道,同时又定义了另外一个栈 stemp 来暂时存放 要给离去的汽车让路而从停车场退出来的汽车。 程序中运用了友元函数,使得 parkingmanagement 函数能访问 carstack 和 carqueue 类中的所有成员,但是在调试过程中,这一问题没能很好地解 决,比如如果便道中的第一辆车离开时,则仍会输出需要付费的信息,所 以程序还有点毛病,其它的执行还可以 本实验的模块划分比较合理,定义了车类,栈类,队列类,管理类, 以及入栈,出栈,入队,出对,删除对等函数,通过对各个函数的调用使 程序能按照要求执行相应的操作。 六:测试结果
进入停车场系统,按照提示输入车辆的相关信息,车库容量为 2。 停车场已满,再开进的车需要停在便道上,根据提示输入相关信息。 车辆离开时,在停车场内停车则需要付费,收费标准为每小时 20 元,根据提示 输入车辆停留的时间等信息,显示停留时间和付费金额。
分享到:
收藏