数据结构实验报告模拟停车场管理(含代码)
数据结构课程设计报告书 停车场管理系统

#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 100/*预设停车场有100个车位*/#define D 1.2/*预设车辆停车费为1.2元每小时*/ #define NUMBER 100void menu();void start();void parkingplace();void drive();struc car{int carnumber;int cararrave;int carleave;int carplace;}car[NUMBER];struct park;{int null;}parkingplace[N-1];void main (){menu();/*菜单*/}void menu(){int n;do{puts("****MENU***");puts("1、停车");puts("2、开车");puts("3、退出");puts("4、初始化");printf("请选择你需要的服务(1-4):");scanf("%d",&n);}switch(n){case 1:parking;break;/*停车函数*/case 2:drive;brea ;/*开车函数*/case 3:exit;break;/*退出*/case 4:start;break;/*初始化*/}}void start()/*初始化*/{int i,j;for(i=0;j<N;i++)parking[i].null=0;/*停车场设置为空*/printf("已初始化");menu();}void parkingplace()/*车辆进入函数*/{int i,a,h=0;printf(“请输入该车系序号(从0开始):”);scanf(“%d”,&a);for(i=0;i<N;i++){if(parking[i].park==0)/*无车标记*/if(parking[i].park==1)/*有车标记*/h=h+1;}if(h==N)printf(“停车场内已满!”);else{car[a].carplace=h;parkingplace[h].null=1;printf(“该车应该停在停车场内”);printf(“请输入该车进停车场时间:”);scanf(“d%”,&car[a].cararrave);}void drive()/*车辆离开函数*/{int i,k,time;double(“请输入车辆次序号【】”);scanf(“%d”,&i);printf(“请输入离开时间:”);scanf(“%d”,&car[i]carleave);fee=D*(car[i].carleave-car[i].cardrrave);time=car[i].carleave-car[i].cardrrave;printf(“次序号为%d的车停时间%d小时,应收费%f元”,i,time,fee); }。
数据结构实验(停车场问题)

《数据结构》课程实验实验报告题目:停车场管理专业:计算机科学与几技术ﻩ班级:姓名: ﻩ学号:ﻩ完成日期:一、试验内容设停车场就是一个可以停放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");ﻩﻩﻩ}ﻩ}}五、调试过程调试过程中,车离开得那一部分经常出现错误,运行结果与预想得不太一样,后来发现就是停车场得计数器那出现了问题,使离开后再进入停车场得位置发生了错误.如果输入得离开时间比到达得时间小,则会出现付费为负值。
数据结构停车场管理实验报告

数据结构停车场管理实验报告一、实验目的本次实验旨在通过设计和实现一个停车场管理系统,深入理解和应用数据结构中的栈和队列等知识,提高解决实际问题的能力。
二、实验环境编程语言:C++开发工具:Visual Studio三、实验原理1、停车场采用栈结构来存储停放的车辆信息。
栈具有先进后出的特点,符合车辆先进入停车场后离开的逻辑。
2、停车场外的便道采用队列结构来存储等待进入停车场的车辆。
队列具有先进先出的特点,符合车辆按到达顺序进入停车场的需求。
四、实验内容1、设计数据结构定义栈和队列的数据结构,包括存储车辆信息的结构体。
实现栈和队列的基本操作,如入栈、出栈、入队、出队等。
2、功能实现车辆进入停车场:当有车辆进入停车场时,将车辆信息压入栈中。
车辆离开停车场:当有车辆离开停车场时,从栈中弹出相应车辆,并计算停车费用。
显示停车场状态:实时显示停车场内车辆的信息。
处理便道上的车辆:当停车场有空位时,将便道上的车辆依次入停车场。
3、界面设计设计简单的命令行交互界面,方便用户输入操作指令。
五、实验步骤1、定义数据结构```cppstruct Car {int carNumber;int arrivalTime;int departureTime;};class Stack {private:Car stackArray;int top;int capacity;public:Stack(int size) {capacity = size;stackArray = new Carcapacity; top =-1;}~Stack(){delete stackArray;}bool isFull(){return top == capacity 1;}bool isEmpty(){return top ==-1;}void push(Car car) {if (!isFull()){stackArray++top = car;} else {std::cout <<"停车场已满,无法进入!"<< std::endl;}}Car pop(){if (!isEmpty()){return stackArraytop;} else {std::cout <<"停车场为空,无法离开!"<< std::endl; return {-1, -1, -1};}}Car peek(){if (!isEmpty()){return stackArraytop;} else {std::cout <<"停车场为空!"<< std::endl; return {-1, -1, -1};}}};class Queue {private:Car queueArray;int front;int rear;int capacity;public:Queue(int size) {capacity = size;queueArray = new Carcapacity;front = rear =-1;}~Queue(){delete queueArray;}bool isFull(){return (rear + 1) % capacity == front;}bool isEmpty(){return front ==-1;}void enqueue(Car car) {if (!isFull()){if (isEmpty()){front = 0;}rear =(rear + 1) % capacity; queueArrayrear = car;} else {std::cout <<"便道已满,无法等待!"<< std::endl;}}Car dequeue(){if (!isEmpty()){Car car = queueArrayfront;if (front == rear) {front = rear =-1;} else {front =(front + 1) % capacity;}return car;} else {std::cout <<"便道为空!"<< std::endl;return {-1, -1, -1};}}Car frontElement(){if (!isEmpty()){return queueArrayfront;} else {std::cout <<"便道为空!"<< std::endl;return {-1, -1, -1};}}};```2、主函数实现```cppint main(){int parkingLotCapacity = 10; //假设停车场容量为 10 Stack parkingLot(parkingLotCapacity);Queue waitingQueue(parkingLotCapacity);int choice;while (true) {std::cout <<"1、车辆进入停车场" << std::endl;std::cout <<"2、车辆离开停车场" << std::endl;std::cout <<"3、显示停车场状态" << std::endl;std::cout <<"4、退出" << std::endl;std::cout <<"请选择操作:";std::cin >> choice;switch (choice) {case 1: {int carNumber;std::cout <<"请输入车辆号码:";std::cin >> carNumber;Car car ={carNumber, time(NULL),-1};if (!parkingLotisFull()){parkingLotpush(car);std::cout <<"车辆"<< carNumber <<"进入停车场" <<std::endl;} else {waitingQueueenqueue(car);std::cout <<"停车场已满,车辆"<< carNumber <<"在便道等待" << std::endl;}break;}case 2: {int carNumber;std::cout <<"请输入要离开的车辆号码:";std::cin >> carNumber;Car car;bool found = false;for (int i = parkingLottop; i >= 0; i) {if (parkingLotstackArrayicarNumber == carNumber) {car = parkingLotpop();cardepartureTime = time(NULL);found = true;break;}}if (found) {int parkingTime = difftime(cardepartureTime, cararrivalTime);double parkingFee = parkingTime 2; //假设每单位时间停车费为2 元std::cout <<"车辆"<< carNumber <<"离开停车场,停车时间:"<< parkingTime <<"秒,停车费用:"<<parkingFee <<"元" << std::endl;if (!waitingQueueisEmpty()){Car waitingCar = waitingQueuedequeue();parkingLotpush(waitingCar);std::cout <<"便道上的车辆"<< waitingCarcarNumber <<"进入停车场" << std::endl;}} else {std::cout <<"未找到要离开的车辆" << std::endl;}break;}case 3: {std::cout <<"停车场内车辆:"<< std::endl;for (int i = parkingLottop; i >= 0; i) {std::cout << parkingLotstackArrayicarNumber <<"";}std::cout << std::endl;std::cout <<"便道上等待的车辆:"<< std::endl;if (!waitingQueueisEmpty()){for (int i = waitingQueuefront; i!= waitingQueuerear; i =(i + 1) %waitingQueuecapacity) {std::cout << waitingQueuequeueArrayicarNumber <<"";}std::cout << waitingQueuequeueArraywaitingQueuerearcarNumber<< std::endl;} else {std::cout <<"无" << std::endl;}break;}case 4:return 0;default:std::cout <<"无效的选择,请重新输入" << std::endl;}}return 0;}```六、实验结果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已存在。
实验三 停车场模拟管理程序的设计与实现

实验三停车场模拟管理程序的设计与实现一、问题描述设停车场只有一个可停放几辆汽车的狭长通道,只能停放五辆车,另外还有一个便道,可停放无数辆车,停车场只能单向进出,设计一个管理停车场的系统。
二、数据结构实现停车位栈:typedef struct{char name[10];}carname;typedef struct{carname car[6];int top;}seqstackcar;便道队列typedef struct node{carname car[100];int front,rear;int num;}queuenode;三、功能设计1.车进入函数void arrive(seqstackcar *stop,queuenode *lq,carname x)2.车离开函数int leave(seqstackcar *s1,seqstackcar *s2,queuenode *p,carname x)3.查询车函数void chaxun(seqstackcar *s1)四、界面设计可以为用户提供采用多选择式管理停车位使用户使用本系统方便快捷。
五、运行与调试1.汽车进入时的场景2.离开和查询时的场景3.容错检测#include<iostream.h>#include<stdlib.h>#include<string.h>#define maxsize 5typedef struct{char name[10];}carname;carname name1;typedef struct{carname car[6];int top;}seqstackcar;typedef struct node{carname car[100];int front,rear;int num;}queuenode;seqstackcar *init_car(){seqstackcar *s;s=new seqstackcar;if(!s)return NULL;else{s->top=0;return s;}}int push(seqstackcar *s,carname x) {if(s->top==maxsize)return 0;else{s->top++;s->car[s->top]=x;return 1;}carname pop(seqstackcar *s){if(s->top==0){return name1;}else{s->top--;return s->car[s->top+1];}}queuenode *initqueue(){queuenode *q;q=new queuenode;q->front=q->rear=0;q->num=0;return q;}int inqueue(queuenode *q,carname x){if(q->num==100)return 0;else{q->rear=q->rear+1;q->car[q->rear]=x;q->num++;return 1;}}carname outqueue(queuenode *q){if(q->num==0){cout<<"候车处已经没车了"<<endl;return name1;}else{q->front++;q->num--;return q->car[q->front];}}void arrive(seqstackcar *stop,queuenode *lq,carname x){int f;f=push(stop,x);if(f==1)cout<<<<"车在"<<stop->top<<"车位上"<<endl;else{inqueue(lq,x);cout<<<<"车在候车处"<<lq->rear-lq->front<<"车位上"<<endl;}}int leave(seqstackcar *s1,seqstackcar *s2,queuenode *p,carname x){char *b=;int n,f=0;carname y;char *a=;while(s1->top>0&&f!=-1){y=pop(s1);a=;if(strcmp(a,b)!=0&&[0]!='\0')n=push(s2,y);else{f=-1;break;}}if(strcmp(a,b)==0&&[0]!='\0'){cout<<<<"车已经离开停车位"<<endl;while(s2->top!=0){y=pop(s2);push(s1,y);}if(p->rear-p->front>0){y=outqueue(p);push(s1,y);}elsecout<<"候车处没有车"<<endl;}else{cout<<"没有此车"<<endl;while(s2->top!=0){push(s1,y);y=pop(s2);}}return 0;}void chaxun(seqstackcar *s1){if(s1->top==0)cout<<"停车位没有车"<<endl;else{for(int i=1;i<=s1->top;i++)cout<<s1->car[i].name<<"在"<<i<<"车位"<<endl;}}int main(){char ch;seqstackcar *s1,*s2;queuenode *p;int flag;s1=init_car();s2=init_car();p=initqueue();flag=1;while(1){cout<<"请输入字母,A:车进入,L:车退出,E:退出,P:查询"<<endl;cin>>ch;switch(ch){case 'A':{carname q;cout<<"请输入车的名字"<<endl;cin>>;arrive(s1,p,q);}break;case 'L':{carname q1;cin>>;leave(s1,s2,p,q1);}break;case 'E':{cout<<"exit"<<endl;flag=0;}break;case 'P':chaxun(s1);break;default:cout<<"输入错误请重新输入!"<<endl;if(flag==0)break;}}return 0;}。
数据结构停车场管理实验报告

停车场管理实验报告姓名:学号:学院:继续教育学院班级:计算机科学与技术一.实验目的和要求熟练栈和队列的结构特性,掌握在实际问题背景下的应用二.实验主要内容以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
三.实验仪器和环境PC机Windows xp Visual c++ c语言四.实验原理1.概要设计(1)抽象数据类型定义ADT Stack{数据对象:D={ai|ai ∈ElemSet, i=1,2,…n;n>0}数据关系:R1={<ai-1,ai>|ai-1,ai ∈D,i=2,…n}基本操作:InitStack(&S)操作结果:构造一个空栈S。
Push(&S,e)初始条件:栈S已存在。
操作结果:插入e为新的栈顶元素Pop(&S,&e)初始条件:栈S已存在。
操作结果:删除S的栈顶元素,并且用e返回。
}ADT StackADT Queue {数据对象:D={ai|ai ∈ElemSet, i=1,2,…n; n>0}数据关系:R1={<ai-1,ai>|ai-1,ai ∈D, i=2,…n}其中:a1为队头, an为队尾基本操作:InitQueue(&Q);操作结果:构造一个空队列QEnQueue(&Q,&e);初始条件:对列Q已存在。
操作结果:插入元素e为Q的新队尾元素。
DeQueue(&Q,&e);初始条件:对列Q已存在。
操作结果:删除Q的队头元素, 并用e返回。
数据结构课程设计 停车场模拟管理系统报告(含源码)

数据结构课程设计停车场模拟管理系统报告(含源码)《数据结构课程设计》报告专业:软件工程班级: T1123-03学号:姓名: XXX课设题目:停车场模拟管理系统指导教师:马春江成绩:2013-07-03目录一、设计题目 (1)二、设计目的 (1)三、总体设计 (1)(一)问题描述 (1)(二)设计要求 (2)(三)数据结构 (2)四、详细设计 (2)(一)分析与实现 (2)(二)系统模块设计 (3)(三)界面设计 (4)五、设计结果与分析 (6)六、总结(收获和不足) (6)(一)课设的不足 (6)(二)课设的收获 (7)附录程序源码 (7)参考文献: (19)指导教师意见 (20)一、设计题目停车场模拟管理系统。
二、设计目的利用所学的知识,模拟设计一个停车场管理系统。
通过程序设计,了解停车场的工作情况以及是怎么实现停车的,模拟车辆的进入停车场、离开停车场的情况,和收费情况。
三、总体设计(一)问题描述假设停车场可以停放n辆车的狭长通道,而且只有一个入口出口,汽车进入停车场的停放按照先进先放的顺序,依次排满车道。
当停车场已经停满时(已存放了n辆汽车),想进入停车场的车就只能在便道上等待,等到停车有车离开时,便道上的第一辆车进入停车场。
当停车场内的某辆车要离开时,在它后面的车必须离开让出一条道路来,待车开走后,让路的车依次进入停车场,车辆离开时,按时间缴纳费用。
(二)设计要求用栈模拟停车场,用队列模拟停车场外面的等车便道,按照终端输入数据的方式进行模拟管理。
输入1,表示车辆到达;输入2,表示车辆离开;输入3,表示列表显示停车场内外情况;输入4,表示系统帮助;输入5,表示查询车辆;输入0,表示退出程序。
车辆进入停车时,要输入车牌号码和到达时间;车辆离开时,要输入停车场车位号和离开时间,并显示应收费额;车辆查询时,要输入车牌号码;系统帮助,则是一些关于本系统的操作介绍。
(三)数据结构本课程设计使用的数据结构有:顺序栈和链式队列。
数据结构-停车场管理系统实验报告

数据结构-停车场管理系统实验报告数据结构停车场管理系统实验报告一、实验目的本次实验旨在通过设计和实现一个停车场管理系统,深入理解和应用数据结构的知识,包括栈、队列、链表等,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟停车场管理班级:物联网姓名:XXX 学号:XXXXXXX 日期:4月9日一、需求分析1、程序的功能描述按照从终端输入的数据序列进行模拟管理。
1)狭道停车用栈来实现,并且用的顺序栈,等车位的便道用队列来实现,并用链式存储。
2)每一组输入信息包含三个数据项,汽车的“到达”和“离去”的信息,汽车牌照号码,汽车“到达”或“离去”的时刻。
3)对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车子离去,则输出车辆在停车场内停留的时间和缴纳的费用。
(假设在便道等车的时间不收费)4)选作内容:(1)便道也是要收费的,仅仅比狭道收费便宜点。
(2)狭道上的车可以直接开走。
2、输入/输出的要求首先选择操作的模块,根据提示输入车牌和到达时间,程序会告知是否停满或者停车车位。
车牌为10个字符以内的字符串,时间的输入中间有冒号把时分隔开。
3、测试数据1 苏D543 1:101 苏Q123 1:201 苏D145 1:30二、概要设计1、本程序所用的抽象数据类型的定义typedef struct NODE{CarNode *stack[MAX+1];int top;}SeqStackCar;//狭道的堆栈顺序存储typedef struct car{CarNode *data;struct car *next;}QueueNode;//队列的链式存储typedef struct Node{QueueNode *head;QueueNode *rear;}LinkQueueCar;//便道上等候的队列定义2、主模块的流程及各子模块的主要功能○1车辆到达:int Arrival(SeqStackCar *Enter,LinkQueueCar *W)首先定义一个栈和队列的结构体指针为:*p , *t 。
然后申请一个车辆信息的内存空间,并把它赋给栈指针。
车辆到达时就输入车牌号,并通过if(Enter->top<MAX)来判断该车是进车场内还是进便道上,如果是进车场内就把top 加1,显示在车场内的位置,还要输入进车场的时间,然后把该节点进栈。
如果是else 就显示该车要停在便道上,并进行进队列的操作。
○2车辆离开:void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)定义一个整型变量room 记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个if(Enter->top>0) 确保栈不空,然后用个while(1) 确保输入的车辆离开位置的合法性。
如果不和法,显示输入有误,要重新输入。
通过while(Enter->top>room) 判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room); 这个函数计算显示费用。
然后还要用if((W->head!=W->rear)&&Enter->top<MAX) 语句判断便道上有没有车,如果有车就要显示进车场的车的车牌号,并登记进入时间。
3、模块之间的层次关系主函数中包含着各个函数模块,各模块也在互相调用。
比如,离开函数中要计算停车费,故要调取价格函数。
价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。
三、详细设计1、采用C语言定义相关的数据类型#define MAX 3 // 停车场最大容量为3辆,便于观察#define price 0.05typedef struct time{ // 定义时间结构体int hour;int min;}Time;typedef struct node{ // 定义车辆信息结构体char num[10];Time reach;Time leave;}CarNode;2、写出各模块的伪码算法void PRINT(CarNode *p,int room){ // 车辆收费int A1,A2,B1,B2;printf("\n车辆离开的时间:");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n离开车辆的车牌号为:");puts(p->num);printf("\n其到达停车位时间);printf("\n离开停车位时间为:);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\n应交费用为: %2.1f元",((B1-A1)*60+(B2-A2))*price+PRINTE(p,room));free(p);}int Arrival(SeqStackCar *Enter,LinkQueueCar *W)//进入便道或者狭道{CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode));flushall();printf("\n请输入车牌号(例:豫B1234):");gets(p->num);if(Enter->top<MAX){Enter->top++;printf("\n车辆在车场第%d位置.",Enter->top);printf("\n车辆到达时间:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[top]=p;return(1);}else{printf("\n该车须在便道等待!有车位时进入车场");t=(QueueNode *)malloc(sizeof(QueueNode));进入队列,调整指针;printf("请输入进入便道的时间");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));return(1);}}void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) { //车辆的离开int room;CarNode *p,*t;QueueNode *q;if(Enter->top>0) // 判断车场是否为空{while(1){printf("\n请输入车在车场的位置/1--%d/:",Enter->top); scanf("%d",&room);if(room>=1&&room<=Enter->top) break;else printf("\n 输入有误,请重输: ");}while(Enter->top>room) // 把要删除的车辆的前面的车开出来,进临时栈。
{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top]; //把要删除的车辆节点赋给p。
Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1) // 再把临时栈里德车辆进停车场{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room); // 调用计费函数计费。
if((W->head!=W->rear)&&Enter->top<MAX) //如果便道上有车,则再开进停车场。
{q=W->head->next;t=q->data;Enter->top++;scanf("%d:%d",&(t->reach.hour),&(t->reach.min));// t->leave .hour =t->reach.hour;//t->leave .min =t->reach.min;W->head->next=q->next;if(q==W->rear) W->rear=W->head;Enter->stack[Enter->top]=t;PRINTE(t,room);free(q);}else printf("\n便道里没有车.\n");}else printf("\n车场里没有车.");}3、画出函数的调用关系图|---------------->到达函数-----||---------------->离开函数-------->停车费用主函数----------->显示车场里的情况|---------------->显示便道里的情况四、调试分析1、调试中遇到的问题及对问题的解决方法因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。
解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。
解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、算法的时间复杂度和空间复杂度由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。