当前位置:文档之家› 数据结构 停车场管理

数据结构 停车场管理

实习报告题目:停车场管理姓名:袁韬博学号:16030120021 完成日期:2017.10.23一、需求分析1.本题目要求建立一个可指定长度的栈,和长度可变化的队列,以当作停车场和便道的车的存放。

2.本题目要求在停车场的车离开时,便道的车按照先后顺序进入一辆,并开始于此时记录时间。

3.在本题目之中在便道的停车不计费用,在此题中应判断在停车场还是在便道的信息。

4.本题目要求根据数据的第一位数据判断进入还是离开,根据要求输出信息。

5.程序执行命令为:1.存入车辆时输出停车信息2.车辆离开时输出停车时间和应缴纳费用 3.输入‘E’时表示结束。

6.测试数据:n=2,m(每小时停车费用)=3,(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表示为Arrival(到达),D表示为Departure(离开),E表示为End(结束)。

二、概要设计1.设定栈的抽象数据类型定义数据对象:D={a i|a i∈SStop,i=1,2,3,······,n}数据关系:R={<a i>|a i∈D, i=1,2,3,······,n }基本操作:initStack(&S,d)操作结果:建立一个长度为d的空栈Push(&S, &e, &d)初始条件:栈已存在,长度为d操作结果:如栈已满返回false,否则将e,压入栈中,返回truePop(&S, e)初始条件:栈已存在操作结果:如栈为空返回false,否则弹栈入e,返回true2.设定队列的抽象数据类型定义数据对象:D={a i|a i∈SStop,i=1,2,3,······,n}数据关系:R={<a i>|a i∈D, i=1,2,3,······,n }*SQTypeInit()操作结果:建立一个空队列InSQType(*q, &data)初始条件:队列已存在操作结果:将data压入队列之中*OutSQType( *q)初始条件:队列已存在操作结果:弹出队列,返回其指针。

3.程序包含6个模块1)主程序模块:包含栈与队列的对象建立,输入值的判断以及函数的实现2)栈模块:实现停车场抽象数据类型3)队列模块:实现便道抽象数据类型4)函数模块:实现数据的输入,进入和离开的弹栈与压栈及输出操作三、详细设计#include<stdio.h>#include<iostream>#include<malloc.h>using namespace std;typedef struct{ //定义车辆的结构体char a; //进入与离开信息int b; //车牌号int c; //进入或离开时间int d; //在停车场或便道的序号int e; //在停车场为1,在便道为0}SStop;typedef struct{ //定义栈结构体SStop *base; //定义栈底指针SStop *top; //定义栈顶指针SStop a; //定义栈元素}Stop;struct SQType //定义队列结构体{SStop data[100]; //分配队列neicunint head; //定义队列头int tail; //定义队列尾};SQType *SQTypeInit()//建立空队列{SQType * q; //定义队列指针if(q=new SQType) //建立队列{q->head=0; //将队列的头的定为0q->tail=0; //将队列的尾的定为0return q; //返回队列指针}else{return NULL; //建立不成功返回NULL}}int InSQType(SQType *q,SStop &data)//入队列操作{if(q->tail==100) //如果队列满返回"队列已满!操作失败!"{cout<<"队列已满!操作失败!"<<endl;return 0;}else //如果队列不满将data入队列并设置该车的停车位置{data.d=1-q->head+q->tail;q->data[q->tail++]=data;return 1;}}SStop *OutSQType(SQType *q)//出队列操作{if(q->tail==q->head) //如果队列为空返回NULL{return NULL;}else //如果队列不为空出队列并返回此数据指针{return &(q->data[q->head++]);}}bool initStack(Stop &S,int d){ //建立空栈S.base=(SStop*)malloc(d*sizeof(SStop)); //分配长达d的内存if(!S.base)return false; //分配不成功返回falseS.top=S.base; //是栈顶指针等于栈底指针return true; //建立成功返回ture}bool Push(Stop &S,SStop &e,int &d){ //压栈操作if(S.top-S.base>=d)return false; //如果栈满返回falseif(S.top==S.base)e.d=1; //如果栈为空将e的停车位置设为1 else e.d=1+S.top-S.base; //设置e的停车位置*S.top++=e; //将e压入栈中return true; //返回true}bool Pop(Stop &S,SStop &e){ //弹栈操作if(S.top==S.base)return false; //如果栈为空返回falsee=*--S.top; //弹栈并将其值赋给ereturn true; //返回true}int Scanf(SStop &e){ //输入数据操作cin>>e.a; //输入操作cin>>e.b; //输入车牌号cin>>e.c; //输入进入或离开时间e.d=0;return 0;}int Arrival(Stop &stop,SQType *wait,SStop &e,int &n,SStop a[],int&y){//进入操作if(Push(stop,e,n)){ //如果栈不满将e压入栈e.e=1; //将判断数据设置为1a[y]=e;y++; //将数据存入数组cout<<e.b<<"车停在停车场的"<<e.d<<"位置"<<endl ;//打印停车位置}else{ //如果栈满将e入队列InSQType(wait,e);e.e=0; //将判断数据数值为0a[y]=e;y++; //将数据存入数组cout<<e.b<<"车停在便道的"<<e.d<<"位置"<<endl; //打印停车位置}}int Departure(Stop &stop,SStop a[],Stop &wait1,SQType *wait,SStop&e,int &n,int &y,int &rt){//离开操作int o=0;SStop *q,u,mn,*kl;for(int i=0;i<y;i++){ //应用循环判断停车时间if(e.b==a[i].b){e.e=a[i].e;e.d=a[i].d;o=e.c-a[i].c;}}int ui=0;if(e.e==0){cout<<"该车在停车场停车时间为:0"<<" "<<"费用为0"<<endl; //如果未进入停车场,打印停车时间与费用while(e.d-wait->head>1){ //将e之前的数据出队列再入队列kl=OutSQType(wait);InSQType(wait,*kl);}if(wait!=NULL)OutSQType(wait); //将e出队列while(wait->tail-e.d-wait->head>1&&wait!=NULL){// 将e之后的数据出队列再入队列mn=*OutSQType(wait);InSQType(wait,mn);}}if(e.e==1){cout<<"该车在停车场停车时间为:"<<o<<" "<<"费用为:"<<o*rt<<endl; //如果在停车场之中,计算费用并输出while(ui<n-e.d){ //将e之后的数据出栈Pop(stop,u);Push(wait1,u,n);ui++;}Pop(stop,mn); //将e出栈while(wait1.top!=wait1.base){//将先前出栈数据压入栈中Pop(wait1,u);Push(stop,u,n);}q=OutSQType(wait); //从队列中出一个数据if(q!=NULL){Push(stop,*q,n); //将q压入栈中for(int i=0;i<y;i++){if(q->b==a[i].b){a[i].e=1; //用循环将q的判断数据设置为1a[i].c=e.c; //用循环将q的如停车场时间设为e离开时间}}}}return 0;}int main(){ //主函数模块SStop as[100]; //定义一个数组存储车辆信息Stop stop,wait1; //定义两个栈SQType *wait; //定义队列int n,m,y=0;cout<<"输入停车场长度:"; //输入ncin>>n;cout<<"请输入每小时停车费用:"; //输入mcin>>m;initStack(stop,n); //建立空栈stopinitStack(wait1,n); //建立空栈wait1wait=SQTypeInit(); //建立空队列waitSStop a;loop:cout<<"请输入数据:";Scanf(a); //应用函数输入数据if(a.a=='A'){ //如果为进入执行进入操作Arrival(stop,wait,a,n,as,y);}if(a.a=='D'){ //如果为离开执行离开操作Departure(stop,as,wait1,wait,a,n,y,m);}if(a.a!='E')goto loop;cout<<"结束"<<endl; //如果为‘E’结束return 0;}四、调试分析1.在此程序之中,一开始在栈与队列的建立是出现指针的错乱,检查后更改。

相关主题