数据结构停车场问题实验报告汇总

合集下载

停车场管理实验报告3篇

停车场管理实验报告3篇

停车场管理实验报告第一篇:实验简介本次实验是关于停车场管理的,旨在探讨停车场的管理方法以及利用计算机技术对停车场进行智能管理的可行性。

实验过程中,我们首先对停车场的基本情况进行了调查和分析,并确定了停车场的布局和车位数量。

然后,我们设计了一个基于计算机视觉技术的车牌识别系统,能够自动识别汽车牌照,并将其和相应的车位绑定。

最后,我们开发了一个基于云端的管理系统,能够实时监控停车场的使用情况,统计收益和预测流量,优化停车场管理。

通过本次实验,我们希望能够提高停车场的利用率,降低管理成本,提高用户体验。

第二篇:实验步骤1. 调查和分析首先,我们对停车场的周边环境、车流量、停车需求等进行了调查和分析,并根据调查结果确定了停车场的布局和车位数量。

2. 设计车牌识别系统我们采取了基于计算机视觉技术的车牌识别系统,能够自动识别汽车牌照,并将其和相应的车位绑定。

该系统主要分为以下三个部分:(1)摄像头:采用高清摄像头,能够自动对焦和自动曝光,提高识别准确率。

(2)软件系统:采用OpenCV图像处理库进行开发,能够自动识别车牌,并提取车牌号码信息。

(3)数据存储:采用MySQL数据库进行存储,能够存储车牌号码和相应的车位信息,方便管理。

3. 开发管理系统我们开发了一个基于云端的管理系统,能够实时监控停车场的使用情况,统计收益和预测流量,优化停车场管理。

该系统主要包括以下功能:(1)实时监控:通过车牌识别系统和摄像头,能够实时监控停车场内的车辆,并提供车位信息和空余位置。

(2)预约停车:用户可以通过手机或网站进行预约停车,并预定相应的车位。

(3)收费管理:管理人员可以通过系统对停车场的收费进行监控和管理,能够统计收益和优化停车场营运。

4. 测试和优化最后,我们进行了系统的测试和优化,并对系统的性能进行了评估和改进,确保停车场管理系统的稳定和可靠性。

第三篇:实验结果与展望经过长时间的实验和努力,我们开发出了一套基于计算机视觉技术的停车场管理系统,能够实现车辆自动识别和智能管理。

停车系统实验报告

停车系统实验报告

一、实验背景随着城市化进程的加快,汽车数量不断增加,停车难问题日益突出。

为了提高停车效率,减少交通拥堵,实现停车场管理的智能化,我们设计并实现了一个基于数据结构的停车场管理系统。

本系统采用栈和队列数据结构模拟停车场的运行过程,实现了车辆进出、停车位置分配、费用计算等功能。

二、实验目的1. 理解并掌握栈和队列数据结构在停车场管理中的应用。

2. 设计并实现一个停车场管理系统,实现车辆进出、停车位置分配、费用计算等功能。

3. 体会数据结构在实际问题中的应用价值。

三、实验内容1. 系统设计(1)数据结构设计停车场:采用顺序栈实现,栈顶表示停车场最北端,栈底表示停车场最南端。

便道:采用链队列实现,队首表示便道最北端,队尾表示便道最南端。

汽车信息:定义一个结构体,包含车牌号、到达时间、离开时间、停车费用等属性。

(2)功能模块设计进出停车场:根据车辆到达或离开的时间,判断车辆是进入停车场还是离开停车场。

停车位置分配:根据停车场和便道的实际情况,为车辆分配停车位置。

费用计算:根据车辆在停车场停留的时间,计算停车费用。

输出结果:输出每辆车到达后的停车位置、离开时的费用和停留时间。

2. 系统实现(1)数据结构实现顺序栈:使用数组实现,提供入栈、出栈、判空等操作。

链队列:使用链表实现,提供入队、出队、判空等操作。

(2)功能模块实现进出停车场:根据车辆到达或离开的时间,判断车辆是进入停车场还是离开停车场。

停车位置分配:根据停车场和便道的实际情况,为车辆分配停车位置。

费用计算:根据车辆在停车场停留的时间,计算停车费用。

输出结果:输出每辆车到达后的停车位置、离开时的费用和停留时间。

3. 系统测试(1)功能测试测试车辆进出停车场功能。

测试停车位置分配功能。

测试费用计算功能。

(2)性能测试测试系统在高并发情况下的性能。

四、实验结果与分析1. 功能测试结果经过测试,系统各项功能均能正常运行,满足设计要求。

2. 性能测试结果在高并发情况下,系统运行稳定,性能良好。

数据结构停车场问题实验报告汇总

数据结构停车场问题实验报告汇总

数据结构停车场问题实验报告汇总1. 引言停车场问题是计算机科学中经典的数据结构问题之一。

在实际生活中,停车场管理对于有效利用空间和提高停车效率至关重要。

本实验旨在通过设计和实现一个停车场管理系统,探索不同数据结构在解决停车场问题上的应用。

2. 实验目的本实验的主要目的是通过实现停车场管理系统,探索以下内容:- 学习数据结构的基本概念和原理;- 理解停车场问题的本质和需求;- 选择合适的数据结构来解决停车场问题;- 设计和实现停车场管理系统;- 进行性能分析和评估。

3. 实验方法本实验采用如下方法来完成停车场管理系统的设计和实现:- 确定停车场问题的需求和功能;- 选择合适的数据结构,如队列、栈、链表等;- 设计停车场管理系统的数据结构和算法;- 实现停车场管理系统的核心功能,包括车辆进入和离开、停车位管理、收费等;- 进行系统测试和性能评估。

4. 实验结果经过设计和实现,我们成功完成了停车场管理系统,并进行了系统测试和性能评估。

以下是我们得到的一些实验结果:- 系统能够准确地记录车辆的进入和离开时间;- 系统能够根据停车时间计算出合适的停车费用;- 系统能够管理停车位的分配和释放;- 系统具有良好的性能和稳定性。

5. 实验分析通过实验结果的分析,我们得出以下结论:- 队列是一个适合管理停车场的数据结构,可以实现先进先出的车辆进出顺序;- 栈可以用于实现停车场的历史记录,方便查询和管理;- 链表可以用于实现停车位的分配和释放;- 在实际应用中,停车场管理系统需要考虑并发访问和高效查询等问题。

6. 实验总结本实验通过设计和实现停车场管理系统,深入理解了数据结构的应用和原理。

通过实验,我们学到了以下知识和技能:- 数据结构的基本概念和原理;- 停车场问题的本质和需求;- 选择合适的数据结构解决问题;- 设计和实现停车场管理系统;- 进行系统测试和性能评估。

7. 参考文献[1] Weiss, Mark Allen. Data Structures and Algorithm Analysis in Java. Pearson Education, 2013.[2] Cormen, Thomas H., et al. Introduction to Algorithms. MIT Press, 2009.以上是对数据结构停车场问题实验报告的汇总,通过本实验我们深入了解了停车场问题的本质和需求,并成功设计和实现了停车场管理系统。

数据结构实验(停车场问题)

数据结构实验(停车场问题)

《数据结构》课程实验实验报告题目:停车场管理专业:计算机科学与几技术ﻩ班级:姓名: ﻩ学号:ﻩ完成日期:一、试验内容设停车场就是一个可以停放n辆汽车得狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间得先后顺序,依次由北向南排列(大门在最南端,最先到达得第一辆车停放在车场得最北端),若车场内已经停满n辆汽车,则后来得汽车只能在门外得便道上等候,一旦有车开走,则排在便道上得第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入得车辆必须先退出场为它让路,待该辆车开出大门外,其她车辆再按次序进入车场,每辆停放在车场得车在它离开停车场时必须按它停留得时间长短交纳费用,试为停车场编制按上述要求进行管理得模拟程序.以栈模拟停车场,以队列模拟车场外得便道,按照从终端读入得输入数据序列进行模拟管理。

每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去得时刻。

对一组输入数据进行操作后得输出信息为:若就是车辆到达,则输出汽车在停车场内或便道上得停车位置;若就是车辆离去,则输出汽车在停车场内停留得时间与应交纳得费用(在便道上停留得时间不收费)。

二、试验目得(1)深入了解栈与队列得特性,掌握栈与队列得存储方法.(2)掌握栈与队列得基本操作,如初始化、入栈(队列)、出栈(队列)等,并能在实际问题背景下灵活运用。

三、流程图四、源程序代码#include<stdio、h>#include<stdafx、h〉void main(){struct cc1{int hm1,sk1;ﻩ}a[5];//停车场struct bd{inthm2,sk2;ﻩ}b[5];//便道ﻩstruct cc2ﻩ{ﻩﻩinthm3,sk3;}c[4];//存放从停车场内退出得车int p=0,q=0,x=0,n,y,t,r,i,j,g,h,z;char m;printf(”输入停车场容量与每分钟收费\n”);ﻩscanf(”%d%d”,&n,&y);printf(”输入数据:\n");for(;;){ﻩscanf(”%c",&m);//判断输入数据ﻩﻩif(m=='e'||m==’E’)ﻩbreak;ﻩscanf("%d%d",&t,&r);//t表示车牌号,r表示时间//车到达ﻩif(m=='a'||m=='A'){ﻩif(p<n)ﻩﻩ{//n表示停车场容量,p表示场内车得数量ﻩa[p]、hm1=t;ﻩﻩﻩﻩa[p]、sk1=r;ﻩﻩprintf("车停在停车厂内%d号位置、\n",p+1);ﻩﻩﻩp++;ﻩﻩ}ﻩ//车停在便道内elseﻩﻩ{ﻩﻩb[q]、hm2=t;ﻩﻩﻩﻩb[q]、sk2=r;ﻩprintf("车停在便道上%d号位置、\n",q+1);ﻩﻩq++;ﻩﻩ}ﻩﻩ}//车离开ﻩﻩif(m==’d'||m=='D')ﻩﻩ{h=p;ﻩﻩﻩfor(i=0;i<p;i++,g=i)ﻩﻩﻩif(a[i]、hm1==t)ﻩﻩ{//判断车就是否停在场内ﻩﻩp--;ﻩﻩif(i==p)//如果车停在场内最后一位ﻩﻩﻩprintf(”%d号车在停车厂内停留了%d分钟,应交纳%d元钱、\n”,t,r-a[i]、sk1,y*(r-a[i]、sk1));ﻩelseﻩﻩ{//在它之后进入得车辆先退出场为它让路ﻩfor(j=p;j>i;j-—)ﻩﻩ{ﻩﻩﻩﻩc[x]、hm3=a[j]、hm1;ﻩﻩﻩﻩc[x]、sk3=a[j]、sk1;ﻩﻩﻩx++;ﻩﻩﻩ}ﻩﻩﻩﻩprintf(”%d号车在停车厂内停留了%d分钟,应交纳%d元钱、\n”,t,r-a[i]、sk1,y*(r—a[i]、sk1));ﻩﻩﻩﻩﻩfor(j=i;x—1〉=0;x--,j++)ﻩﻩﻩﻩ{//退出得车再进入停车场内ﻩﻩﻩﻩa[j]、hm1=c[x—1]、hm3;ﻩﻩﻩﻩﻩa[j]、sk1=c[x-1]、sk3;ﻩ}}ﻩﻩﻩﻩif(q!=0)ﻩﻩﻩﻩ{//便道内得车进入停车场ﻩﻩﻩa[p]、hm1=b[0]、hm2;ﻩﻩﻩa[p]、sk1=r;ﻩﻩﻩﻩp++;ﻩﻩﻩfor(j=0;j<q-1;j++)ﻩﻩﻩﻩ{ﻩﻩﻩb[j]、hm2=b[j+1]、hm2;ﻩﻩb[j]、sk2=b[j+1]、sk2;ﻩﻩ}ﻩq-—;ﻩﻩﻩ}ﻩbreak;}ﻩﻩﻩ//判断车就是否停在便道上ﻩﻩfor(i=0;i〈q;i++,z=q)ﻩﻩﻩif(b[i]、hm2==t)ﻩ{ﻩﻩﻩﻩprintf(”该车停留在便道内,不收费、\n");ﻩfor(j=i;j〈q-1;j++)ﻩﻩ {ﻩﻩ b[j]、hm2=b[j+1]、hm2;ﻩﻩﻩb[j]、sk2=b[j+1]、sk2;ﻩﻩ}ﻩq—-;ﻩﻩ break;ﻩﻩ}if(g==h&&i==z) printf(”无该车、\n");ﻩﻩﻩ}ﻩ}}五、调试过程调试过程中,车离开得那一部分经常出现错误,运行结果与预想得不太一样,后来发现就是停车场得计数器那出现了问题,使离开后再进入停车场得位置发生了错误.如果输入得离开时间比到达得时间小,则会出现付费为负值。

数据结构-停车场-实验报告与代码

数据结构-停车场-实验报告与代码

一.需求分析1、题目要求:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。

车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。

若停车场已经停满n辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,每两停在车场的车要安时间长短缴费。

要求:以栈模拟停车场,以队列车场外的便道,按照从终端输入的数据序列进行模拟管理。

每一组数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、以及到达或离去的时刻。

对每一组数据进行操作后的信息为:若是车辆到达,则输出汽车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。

栈以顺序结构实现,队列以链表结构实现。

2、程序能达到的功能:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。

二.算法设计本程序中采用的数据模型,用到的抽象数据类型的定义,程序的主要算法流程及各模块之间的层次调用关系程序基本结构:结构体定义:(1)车辆信息的表示车辆可看成是一个节点,设计成一个结构体,定义如下:typedef struct node{char num[10]; //车牌号码Time reach; //到站时间Time leave; //离开时间}CarNode;(2)时间、栈和队列的定义时间是由小时和分钟表示的,有两部分数据,定义如下:typedef struct time{int hour;int min;}Time;停车场内用栈表示:typedef struct NODE{CarNode *stack[MAX+1]; //栈用顺序表示int top;}SeqStackCar;便道上的车辆表示:typedef struct car{CarNode *data; // 便道上的车用链表表示truct car *next;}QueueNode;typedef struct Node{QueueNode *head; // 设置头指针、尾指针。

数据结构停车场问题实验报告

数据结构停车场问题实验报告

数据结构课程设计——停车场管理问题姓名:学号:一、问题描述设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。

车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。

如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。

停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。

如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。

编制一程序模拟该停车场的管理。

二、实现要求要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。

三、实现提示汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。

例如,(‘A’,,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,,5,20)表示5号牌照车在20这个时刻离去。

整个程序可以在输入信息为(‘E’,0,0)时结束。

本题可用栈和队列来实现。

四、需求分析停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。

停车场的管理流程如下①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。

②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。

当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队列头取出一辆车压入栈中。

五、流程图六、详细设计1.本程序主要包含四个模块1) 主程序模块int main(){Initialization();CarNode car;SqStack Park,TempPark;LinkQueue Q;InitStack(Park);InitStack(TempPark);InitQueue(Q);while((scanf("%c%d%d",&car.event,&car.num,&car.time))&&(car.event!='e'&&car .event!='E')){getchar();//除去输入结束时的回车switch(car.event){case 'A':case 'a':Arrive(Park,Q,car);break;case 'D':case 'd':Leave(Park,TempPark,Q,car);break;default: printf("您的第一个数据输入有误!\n");break;}}printf("程序结束,谢谢使用!\n");return 0;2)分别构造空栈和空队列栈:Status InitStack(SqStack &S){ //构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));if(!S.base){exit(OVERFLOW);printf("存储空间分配失败");}S.top=S.base;return OK;}队列:Status InitQueue(LinkQueue &Q){ //构造一个空队列(带头结点)Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));if(!Q.front){exit(OVERFLOW);printf("存储空间分配失败");}Q.front->next=NULL;Q.queuesize=0;return OK;3)车辆到达处理Status Arrive(SqStack &S,LinkQueue &Q,CarNode &e){ //车辆到达处理if((S.top-1)->time<=e.time){ //时间处理if(!Check_Stack(S,e)&&!Check_Queue(Q,e)){ //是否已存在if(S.top-S.base<MAX){Push(S,e);printf("成功进入停车场,在%d号车库!\n",S.top-S.base);return OK;}else{EnQueue(Q,e);printf("停车场已满,车辆进入便道,在%d号车位!\n",Q.queuesize);}}elseprintf("该牌照的车已存在,输入有误,请重新输入\n");return OK;}else{printf("时间输入有误,请重新输入!\n");return FALSE;}}4)车辆离开处理Status Leave(SqStack &S,SqStack &TempS,LinkQueue &Q,CarNode &e){//车辆离开处理CarNode a;int leatime,leanum;intentertime; //进入停车场时间int cost;if(!(Check_Stack(S,e) || Check_Queue(Q,e))){printf("数据输入错误,本停车场内无所查询车辆,请重新输入!\n");return true;}else{if(Check_Stack(S,e)) //若需要离开的车辆在停车场{if(e.num==(S.top-1)->num)//车辆处在栈顶{Pop(S, a);leatime=e.time;leanum=e.num;entertime=a.time;printf("车辆进入车库时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);}else//车辆处在栈中间{do{Pop(S,a);//从栈中依次退出Push(TempS,a);//依次进入临时栈}while((S.top-1)->num!=e.num);//直到top指针下一个位置的num=车牌号Pop(S,a); //该车离开leatime=e.time;leanum=e.num;entertime=a.time;printf("车进入停车场时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);do{ //其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);}while(TempS.top!=TempS.base);//条件与上面不同,此时是全部回去}cost=(leatime-entertime)*price;if(cost>=0)printf("您的车牌号为 %d 的车应交纳的费用是:%d\n",leanum,cost);if(Q.front!=Q.rear){//队列不空的话从便道进停车场DeQueue(Q,a);if(a.time<leatime) //便道车辆进车库时间应该比车库车辆离开时间晚entertime=leatime;a.time=leatime;Push(S,a);//该车进入停车场printf("车牌号为%d的车辆从便道上进入%d号车库!从现在开始计时,现在时间为:%d\n",a.num,S.top-S.base,a.time);}}else if(Check_Queue(Q,e)){ //从便道直接离开do{DeQueue(Q,a);EnQueue(Q,a);}while(Q.front->next->data.num!=e.num);DeQueue(Q,e);//前面的车进入队尾printf("您的车牌号为 %d 的车辆未进入车库从便道直接离开,费用为0!\n",e.num);}}return true;2.主要设计程序如下#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define MAX 2 //停车场容量#define price 2 //单价#define OK 1#define FALSE 0#define TRUE 1#define ERROR -1#define OVERFLOW -2typedef int Status;//===================================================================== typedef struct CarNode{char event;int num;int time;}CarNode; //车辆信息结点typedef struct SqStack{CarNode *base;CarNode *top;int Stacksize;}SqStack; //栈(停车场)typedef struct QNode{CarNode data;struct QNode *next;}QueueNode; //便道结点typedef struct LinkQueue{QueueNode *front;QueueNode *rear;int queuesize;}LinkQueue; //队列(便道)//===================================================================== Status InitStack(SqStack &S){ //构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));if(!S.base){exit(OVERFLOW);printf("存储空间分配失败");}S.top=S.base;return OK;}//===================================================================== Status InitQueue(LinkQueue &Q){ //构造一个空队列(带头结点) Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));if(!Q.front){exit(OVERFLOW);printf("存储空间分配失败");}Q.front->next=NULL;Q.queuesize=0;return OK;}//=====================================================================Status GetTop(SqStack S,CarNode &e){ //返回栈顶元素if(S.top==S.base)return ERROR;e=*(S.top-1);return TRUE;}//===================================================================== Status Pop(SqStack &S,CarNode &e){ //删除栈顶元素if(S.top==S.base)return ERROR;e=*--S.top;return OK;}//===================================================================== Status Push(SqStack &S,CarNode e){//插入元素为新的栈顶元素(在栈不满的前提下) if(S.top-S.base>=MAX)return FALSE;*S.top++=e;return OK;}//===================================================================== Status DeQueue(LinkQueue &Q,CarNode &e){ //删除队头元素(带头结点) if(Q.rear==Q.front)return ERROR;QueueNode *p=Q.front->next;e=p->data;Q.front->next=p->next;if(p==Q.rear)Q.rear=Q.front;free(p);Q.queuesize--;return OK;}//===================================================================== Status EnQueue(LinkQueue &Q,CarNode e){ //插入新的队尾元素QueueNode *p=(QueueNode*)malloc(sizeof(QueueNode));if(!p)exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;Q.queuesize++;return OK;}//===================================================================== Status Check_Stack(SqStack &S,CarNode e){//车辆到达时车库内是否有同名车 CarNode *Temp=S.base;while((Temp!=(S.top))&&(Temp->num!=e.num))Temp++;if((Temp==S.top))return FALSE;elsereturn TRUE;}//===================================================================== Status Check_Queue(LinkQueue &Q,CarNode e){//车辆到达时便道上是否有同名车 QueueNode *Temp=Q.front;while((Temp!=Q.rear) && (Temp->data.num!=e.num))Temp=Temp->next;if((Temp==Q.rear) && (Temp->data.num!=e.num))return FALSE;elsereturn TRUE;}//=====================================================================Status Arrive(SqStack &S,LinkQueue &Q,CarNode &e){ //车辆到达处理if((S.top-1)->time<=e.time){ //时间处理if(!Check_Stack(S,e)&&!Check_Queue(Q,e)){ //是否已存在if(S.top-S.base<MAX){Push(S,e);printf("成功进入停车场,在%d号车库!\n",S.top-S.base);return OK;}else{EnQueue(Q,e);printf("停车场已满,车辆进入便道,在%d号车位!\n",Q.queuesize);}}elseprintf("该牌照的车已存在,输入有误,请重新输入\n");return OK;}else{printf("时间输入有误,请重新输入!\n");return FALSE;}}//=====================================================================Status Leave(SqStack &S,SqStack &TempS,LinkQueue &Q,CarNode &e){//车辆离开处理CarNode a;int leatime,leanum;intentertime; //进入停车场时间int cost;if(!(Check_Stack(S,e) || Check_Queue(Q,e))){printf("数据输入错误,本停车场内无所查询车辆,请重新输入!\n");return true;}else{if(Check_Stack(S,e)) //若需要离开的车辆在停车场{if(e.num==(S.top-1)->num)//车辆处在栈顶{Pop(S, a);leatime=e.time;leanum=e.num;entertime=a.time;printf("车辆进入车库时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);}else//车辆处在栈中间{do{Pop(S,a);//从栈中依次退出Push(TempS,a);//依次进入临时栈}while((S.top-1)->num!=e.num);//直到top指针下一个位置的num=车牌号Pop(S,a); //该车离开leatime=e.time;leanum=e.num;entertime=a.time;printf("车进入停车场时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);do{ //其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);}while(TempS.top!=TempS.base);//条件与上面不同,此时是全部回去}cost=(leatime-entertime)*price;if(cost>=0)printf("您的车牌号为 %d 的车应交纳的费用是:%d\n",leanum,cost);if(Q.front!=Q.rear){//队列不空的话从便道进停车场DeQueue(Q,a);if(a.time<leatime) //便道车辆进车库时间应该比车库车辆离开时间晚entertime=leatime;a.time=leatime;Push(S,a);//该车进入停车场printf("车牌号为%d的车辆从便道上进入%d号车库!从现在开始计时,现在时间为:%d\n",a.num,S.top-S.base,a.time);}}else if(Check_Queue(Q,e)){ //从便道直接离开do{DeQueue(Q,a);EnQueue(Q,a);}while(Q.front->next->data.num!=e.num);DeQueue(Q,e);//前面的车进入队尾printf("您的车牌号为 %d 的车辆未进入车库从便道直接离开,费用为0!\n",e.num);}}return true;}//=====================================================================voidInitialization(){ //初始化程序printf("姓名:杨智伟学号:2012040651\n");printf("==========================================================\n");printf("* 停车场管理模拟程序 *\n");printf("==========================================================\n");printf("请依次输入车辆到达(A/a)/离去(D/d)/结束(E/e)信息、车牌号以及当前时间:\n\n");}//=====================================================================int main(){Initialization();CarNode car;SqStack Park,TempPark;LinkQueue Q;InitStack(Park);InitStack(TempPark);InitQueue(Q);while((scanf("%c%d%d",&car.event,&car.num,&car.time))&&(car.event!='e'&&car .event!='E')){getchar();//除去输入结束时的回车switch(car.event){case 'A':case 'a':Arrive(Park,Q,car);break;case 'D':case 'd':Leave(Park,TempPark,Q,car);break;default: printf("您的第一个数据输入有误!\n");break;}}printf("程序结束,谢谢使用!\n");return 0;}七、程序运行截图1.交互界面2.车辆进入3.车辆离去4.停车场已满进入便道5.便道车辆进入车库6.程序结束界面八、实验总结1.学会了栈和队列的综合使用,更加灵活运用栈和队列。

数据结构--停车场管理-完整版-实习报告

数据结构--停车场管理-完整版-实习报告

实习报告题目:停车场管理一.需求分析1.用栈来表示停车场,用队列来表示停车道。

2.用户需输入车辆的必要信息,如车辆的到达或离开,汽车牌号以及到达或离去的时刻。

停车场的容量及单位时间的停车费由编程序者自行设置,结构需输出车辆停车所需缴纳的费用。

3.本程序要求对车辆的动态能够输出具体的信息内容,包括停车或离开的时间,位置,及所需缴纳的停车费。

4.测试数据为:N=2,输入数据为:(’A’,1,5),(‘A’,2.,10), (‘D’,1,15), (‘A’,3,20), (‘A’,4,25), (‘A’,5,30),(‘D’,2,35), (‘D’,4,40), (‘E’,0,0). 其中:’A’表示到达,’D’表示离去,’E’表示输入结束。

5.程序执行的命令为:1.创建栈和队列。

2.对车辆的行为进行相应的处理。

3.输出车辆的信息。

二.概要设计1.设定栈的抽象数据类型定义:ADT Stack{数据对象:D={ai|ai属于Elem,i=1,2……,n, n>=0}数据关系:R1={<ai-1, ai>| ai-1,ai属于D,i=2,……,n}基本操作:initStack(&S)操作结果:构造一个空栈S.pop(&S,&e)初始条件:栈S已存在。

操作结果:删除S的栈顶元素,并以e返回其值。

push(&S,&e )初始条件:栈S已存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

lengthstack(S)初始条件:栈S已存在。

操作结果:返回S中的元素个数,即栈的长度。

}ADT Stack;2.设定队列的抽象数据类型定义:ADT Queue{数据对象:D={ai| ai属于Elem, i=1,2,……,n, n>=0}数据关系:R1={<ai-1 ,ai>| ai-1,ai 属于D,i=2,……,n}基本操作:initqueue(&Q)操作结果:构造一个空队列Q.enqueue(&Q, e)初始条件:队列Q已存在。

数据结构-停车场管理系统实验报告

数据结构-停车场管理系统实验报告

数据结构-停车场管理系统实验报告数据结构停车场管理系统实验报告一、实验目的本次实验旨在通过设计和实现一个停车场管理系统,深入理解和应用数据结构的知识,包括栈、队列、链表等,提高编程能力和解决实际问题的能力。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、需求分析1、停车场内有固定数量的停车位。

2、车辆进入停车场时,记录车辆信息(车牌号、进入时间)。

3、车辆离开停车场时,计算停车费用并输出相关信息。

4、能够显示停车场内车辆的停放情况。

四、数据结构设计1、为了实现车辆的先进先出,选择队列来存储停车场内的车辆信息。

2、用栈来存储临时停放的车辆信息,以便在停车场已满时进行处理。

五、算法设计1、车辆进入停车场检查停车场是否已满。

如果未满,将车辆信息加入队列,并记录进入时间。

2、车辆离开停车场在队列中查找要离开的车辆。

计算停车时间和费用。

将车辆从队列中删除。

3、显示停车场内车辆停放情况遍历队列,输出车辆信息。

六、主要代码实现```cppinclude <iostream>include <string>include <ctime>using namespace std;//车辆结构体struct Car {string licensePlate; //车牌号time_t entryTime; //进入时间};//队列类class Queue {private:Car data;int front, rear, capacity;public:Queue(int size) {capacity = size;data = new Carcapacity;front = rear = 0;}~Queue(){delete data;}bool isFull(){return (rear + 1) % capacity == front;}bool isEmpty(){return front == rear;}void enqueue(Car car) {if (isFull()){cout <<"停车场已满!"<< endl; return;}datarear = car;rear =(rear + 1) % capacity;}Car dequeue(){if (isEmpty()){cout <<"停车场为空!"<< endl;return Car();}Car car = datafront;front =(front + 1) % capacity;return car;}void display(){if (isEmpty()){cout <<"停车场内没有车辆。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计——停车场管理问题姓名:学号: 问题描述设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。

车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。

如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。

停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。

如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。

编制一程序模拟该停车场的管理。

二、实现要求要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。

三、实现提示汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。

例如,(‘A',,1,5)表示1号牌照车在5这个时刻到达,而(‘ D ',,5,20)表示5号牌照车在20这个时刻离去。

整个程序可以在输入信息为(‘ E ',0,0)时结束。

本题可用栈和队列来实现。

四、需求分析停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。

停车场的管理流程如下①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。

②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。

当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队列头取出一辆车压入栈中。

五、流程图六、详细设计1.本程序主要包含四个模块1)主程序模块int main(){Initialization。

;CarNode car;SqStack Park,TempPark;LinkQueue Q;InitStack(Park);InitStack (TempPark);InitQueue(Q);while((scanf("%c%d%d", &car.event, &car.num, &car.time))&&(car.event!='e'&&car.event!='E')) {getchar();switch(car.event){case 'A':case 'a':Arrive(Park,Q,car);break;case 'D':case 'd':Leave(Park,TempPark,Q,car);break;default: printf("您的第一个数据输入有误!\n");break;}}printf("程序结束,谢谢使用!\n");return 0;2) 分别构造空栈和空队列栈:Status InitStack(SqStack &S){ 〃构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));if(!S.base){exit(OVERFLOW);printf(”存储空间分配失败");}S.top=S.base;return OK;}队列:Status lnitQueue(LinkQueue &Q){ //构造一个空队列(带头结点) Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));if(!Q.front){exit(OVERFLOW);printf("存储空间分配失败");}Q.front->next=NULL;Q.queuesize=O;return OK;3) 车辆到达处理Status Arrive(SqStack & S,LinkQueue & Q,CarNode & e){ // 车辆到达处理if((S.top-1)->time<=e.time){ // 时间处理if(!Check_Stack(S,e)&& !Check_Queue(Q,e)){ // 是否已存在if(S.top-S.base<MAX){Push(S,e);printf("成功进入停车场,在%d号车库!\n",S.top-S.base);return OK;}else{EnQueue(Q,e);printf("停车场已满,车辆进入便道,在%d号车位!\n",Q.queuesize);elseprintf("该牌照的车已存在,输入有误,请重新输入\n");return OK;}else{printf("时间输入有误,请重新输入!\n");return FALSE;}}4) 车辆离开处理Status Leave(SqStack & S,SqStack & TempS,LinkQueue & Q,CarNode &e){ //车辆离开处理CarNode a;int leatime,leanum;int entertime; //进入停车场时间int cost;if(!(Check_Stack(S,e) || Check_Queue(Q,e))){printf("数据输入错误,本停车场内无所查询车辆,请重新输入!\n");return true;}else{if(Check_Stack(S,e)) 〃若需要离开的车辆在停车场{if(e.num==(S.top-1)->num) // 车辆处在栈顶{Pop(S, a);leatime=e.time;leanum=e.num;entertime=a.time;printf(”车辆进入车库时间:%d\t现在(离开)时间:%d\t停留时「可:%d\t\n",entertime,leatime,leatime-entertime);}else //车辆处在栈中间{do{Pop(S,a); 〃从栈中依次退出Push(TempS,a); 〃依次进入临时栈}while((S.top-1)->num!=e.num);〃直到top 指针下一个位置的num=车牌号Pop(S, a); //该车离开leatime=e.time;leanum=e.num;entertime=a.time;printf("车进入停车场时间:%d\t现在(离开)时间:%d\t停留时「可:%d\t\n",entertime,leatime,leatime-entertime);do { 〃其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);}while(TempS.top!=TempS.base);〃条件与上面不同,此时是全部回去}cost=(leatime-entertime)*price;if(cost>=0)printf("您的车牌号为%d的车应交纳的费用是:%d\n",leanum,cost);if(Q.front!=Q.rear){ //队列不空的话从便道进停车场DeQueue(Q,a);if(a.timevleatime) //便道车辆进车库时间应该比车库车辆离开时间晚entertime=leatime;a.time=leatime;Push(S,a); //该车进入停车场printf("车牌号为%d的车辆从便道上进入%d号车库!从现在开始计时,现在时间为:%d\n",a.num,S.top-S.base,a.time);}}else if(Check_Queue(Q,e)){ 〃从便道直接离开do{DeQueue(Q,a);EnQueue(Q,a);}while(Q.front->next->data.num!=e.num);DeQueue(Q,e); 〃前面的车进入队尾printf("您的车牌号为%d的车辆未进入车库从便道直接离开,费用为0!\n",e.num);}}return true;2.主要设计程序如下#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define MAX 2 //停车场容量#define price 2 // 单价#define OK 1#define FALSE 0#define TRUE 1#define ERROR -1#define OVERFLOW -2typedef int Status;//typedef struct CarNode{int num;int time;}CarNode; 〃车辆信息结点typedef struct SqStack{CarNode *base;CarNode *top;int Stacksize;}SqStack; 〃栈(停车场)typedef struct QNode{CarNode data;struct QNode *next;}QueueNode; 〃便道结点typedef struct LinkQueue{QueueNode *front;QueueNode *rear;int queuesize;}LinkQueue; // 队列(便道)//===================================================================== Status lnitStack(SqStack & S){ 〃构造一个空栈S.Stacksize=O;S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));if(!S.base){exit(OVERFLOW);printf("存储空间分配失败");}S.top=S.base;}//===================================================================== Status lnitQueue(LinkQueue & Q){ // 构造一个空队列(带头结点)Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));if(!Q.front){exit(OVERFLOW);printf(”存储空间分配失败");}Q.front->next=NULL;Q.queuesize=O;return OK;}//===================================================================== Status GetTop(SqStack S,CarNode & e){ //返回栈顶元素if(S.top==S.base)return ERROR;e=*(S.top-1);return TRUE;}//===================================================================== Status Pop(SqStack & S,CarNode & e){ 〃删除栈顶元素if(S.top==S.base)return ERROR;e=*--S.top;return OK;}//===================================================================== Status Push(SqStack &S,CarNode e){// 插入元素为新的栈顶元素(在栈不满的前提下) if(S.top-S.base>=MAX)return FALSE;*S.top++=e;return OK;}//===================================================================== Status DeQueue(LinkQueue &Q,CarNode &e){ 〃删除队头元素(带头结点) if(Q.rear==Q.front)return ERROR;QueueNode *p=Q.front->next;e=p_>data;Q.front->next=p->next;if(p==Q.rear)Q.rear=Q.front;free(p);Q.queuesize--;return OK;}//===================================================================== Status EnQueue(LinkQueue & Q,CarNode e){ 〃插入新的队尾元素QueueNode *p=(QueueNode*)malloc(sizeof(QueueNode));if(!p)exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;Q.queuesize++;return OK;} //:Status Check_Stack(SqStack & S,CarNode e){〃车辆到达时车库内是否有同名车CarNode *Temp=S.base;while((Temp!=(S.top))&&( Temp->num!=e.num))Temp++;if((Temp==S.top))return FALSE;elsereturn TRUE;}//===================================================================== Status Check_Queue(LinkQueue & Q,CarNode e){// 车辆到达时便道上是否有同名车QueueNode *Temp=Q.front;while((Temp!=Q.rear) && (Temp->data.num!=e.num))Temp=Temp->next;if((Temp==Q.rear) && (Temp->data.num!=e.num))return FALSE;elsereturn TRUE;}//===================================================================== Status Arrive(SqStack & S,LinkQueue & Q,CarNode & e){ 〃车辆到达处理if((S.top-1)->time<=e.time){ // 时间处理if(!Check_Stack(S,e)&& !Check_Queue(Q,e)){ // 是否已存在if(S.top-S.base<MAX){Push(S,e);printf("成功进入停车场,在%d号车库!\n",S.top-S.base);return OK;} else{EnQueue(Q,e);printf(”停车场已满,车辆进入便道,在%d号车位!\n",Q.queuesize);}elseprintf("该牌照的车已存在,输入有误,请重新输入\n");return OK;}else{printf("时间输入有误,请重新输入!\n");return FALSE;}}//========================================================Status Leave(SqStack & S,SqStack &TempS,LinkQueue & Q,CarNode &e){ //车辆离开处理CarNode a;int leatime,leanum;int entertime; //进入停车场时间int cost;if(!(Check_Stack(S,e) || Check_Queue(Q,e))){printf("数据输入错误,本停车场内无所查询车辆,请重新输入!\n");return true;}else{if(Check_Stack(S,e)) //若需要离开的车辆在停车场{if(e.num==(S.top-1)->num) // 车辆处在栈顶{Pop(S, a);leatime=e.time;leanum=e.num;entertime=a.time;printf("车辆进入车库时间:%d\t现在(离开)时间:%d\t停留时「可:%d\t\n",entertime,leatime,leatime-entertime);}else //车辆处在栈中间{do{Pop(S,a); 〃从栈中依次退出Push(TempS,a); 〃依次进入临时栈}while((S.top-1)->num!=e.num);〃直到top 指针下一个位置的num=车牌号Pop(S, a); //该车离开leatime=e.time;leanum=e.num;entertime=a.time;printf("车进入停车场时间:%d\t现在(离开)时间:%d\t停留时「可:%d\t\n",entertime,leatime,leatime-entertime);do { 〃其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);}while(TempS.top!=TempS.base);〃条件与上面不同,此时是全部回去}cost=(leatime-entertime)*price;if(cost>=0)printf("您的车牌号为%d的车应交纳的费用是:%d\n",leanum,cost);if(Q.front!=Q.rear){ //队列不空的话从便道进停车场DeQueue(Q,a);if(a.timevleatime) //便道车辆进车库时间应该比车库车辆离开时间晚entertime=leatime;a.time=leatime;Push(S,a); //该车进入停车场printf(”车牌号为%d的车辆从便道上进入%d号车库!从现在开始计时,现在时间为:%d\n",a.num,S.top-S.base,a.time);}}else if(Check_Queue(Q,e)){ 〃从便道直接离开do{DeQueue(Q,a);EnQueue(Q,a);}while(Q.front->next->data.num!=e.num);DeQueue(Q,e); 〃前面的车进入队尾printf("您的车牌号为%d的车辆未进入车库从便道直接离开,费用为0!\n",e.num);}}return true;}//=====================================================================void lnitialization(){ // 初始化程序printf("姓名:杨智伟学号:2012040651\n");printf("==========================================================\n");printf("* 停车场管理模拟程序*\n");printf("==========================================================\n");printf("请依次输入车辆到达(A/a)/离去(D/d)/结束(E/e)信息、车牌号以及当前时间:\n\n"); } //===================================================================== int main(){ Initialization();CarNode car;SqStack Park,TempPark;LinkQueue Q;InitStack(Park);InitStack (TempPark);InitQueue(Q);while((scanf("%c%d%d", &car.event, &car.num, &car.time))&&(car.event!='e'&&car.event!='E')) {getchar(); //除去输入结束时的回车switch(car.event){case 'A':case 'a':Arrive(Park,Q,car);break;case 'D':case 'd':Leave(Park,TempPark,Q,car);break;default: printf("您的第一个数据输入有误!\n");break;}}printf("程序结束,谢谢使用!\n");return 0;}七、程序运行截图1 .交互界面2 .车辆进入= =■==■= = = = =■ = = == = = = = = == = = = = = = == = = === = =* * r车场管理模拟程序请依次输人车辆到达<A/a>/离去<D/d>z结耒信息“车稈母以及当前吋厲h a1 S *成功进入停车场■在1容车库,2 10成功进入停车场•在2号车库?3. 车辆离去- 停车场管理模拟程序*LH.E=. = = = H,=. =.=:™S = =.=.= —— E. =.=.= —S=.=.=. = =S=.=.=. = B« = =.=.™S = =.=.= ——S = =. = S 请依次输入车辆到达<ftz a>z离去5”结束车牌号以及当前时间「a 1 5成功逬入停车场■在1号车眸?a 2 10成功进入停车场”在2号车库?d 1 5 出李进入僵丰场时冋汚圳在「离开)时百停留时间洱您的车楝寻为i關车应交纳的费用是洱4. 停车场已满进入便道- 停车场管理模拟程序*an23.= Z2.£:E;S3ZZ=SSE3iZS: = E12!E=.ZIZZSS.S=2Z = 2ZEi=S3Z2 = lZ=:ST3.= Er::3.J=SE22Z£-ESS.S2E = E.E3E.S!=.= £l=S2请依次输入辛辆到达“心"高去<w 结東CE/I信息、车牌号以及当前时间:甘 1 5成功进入停车场.在i昏车.库甲A 2 10成功进入停车场「在2号■车库甲霸鑼觀算轨交髓靈2时恥停留时间汨a 3 20咸功进入停车场•在去号车库甲衫车场已满.车辆进入侵道■在,号车位亍a 5 305. 便道车辆进入车库吓譽硼停留时恥¥入溥车库甲从现衽幵始计时,现衽时间为*6.程序结束界面八、实验总结i •学会了栈和队列的综合使用,更加灵活运用栈和队列。

相关文档
最新文档