停车场管理设计.docx
- 文档编号:11988698
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:21
- 大小:136.03KB
停车场管理设计.docx
《停车场管理设计.docx》由会员分享,可在线阅读,更多相关《停车场管理设计.docx(21页珍藏版)》请在冰豆网上搜索。
停车场管理设计
前言
栈和队列是两种特殊的线性表,并且被广泛地应用于各种程序设计中。
通过该程序的演示,能够在今后的学习中更深入的了解栈和队列的特性,在解决实际问题时灵活运用它们。
栈是后进先出的线性表,在使用时附设指针top指示栈顶元素在顺序栈中的位置;队列是先进先出的线性表,在使用时需附设头指针和尾指针。
在停车场管理问题中,使用顺序栈存放进入车场的车辆,链队列存放有关车场外便道的情况,根据题目的要求再进行出栈,退栈,取栈顶元,链队列中的入队和出队,通过此程序的编写及运行,深刻理解线性表和栈的逻辑结构,存储结构,掌握线性表和栈上基本运算的实现,学会如何把学到的知识用于解决实际问题
正文
1.采用类c语言定义相关的数据类型
(1).定义时间结点:
typedefstructtime
{inthour;
intmin;
}Time;
(2).定义车辆信息结点:
typedefstructnode
{charnum[10];
Timereach;
Timeleave;
}CarNode;
(3).定义模拟车站:
typedefstructNODE
{CarNode*stack[MAX+1];//栈的存储容量
inttop;
}SeqStackCar;
(4).定义模拟通道:
typedefstructcar
{CarNode*data;//car的数据域
structcar*next;//car的指针域
}QueueNode;
typedefstructNode
{QueueNode*head;//对头指针
QueueNode*rear;//对尾指针
}LinkQueueCar
2.各模块的伪码算法
(1).栈的初始化:
SeqstackInitStack(SeqStackCar*s)//构造一个空栈
{S.top=0;
ReturnS;
}
(2).链队列的初始化:
intInitQueue(LinkQueueCar*Q)//构造一个空队列
{link*p;
p=newlink;
p->next=NULL;
Q->rear=Q->head=p;
ReturnQ;
}
(3).车辆到达时的算法:
intArrival(SeqStackCar*Enter,LinkQueueCar*W)
{CarNode*p;//p为指向车场栈顶的指针
QueueNode*t;//t为指向便道的指针
p=(CarNode*)malloc(sizeof(CarNode));//分配存储空间
if(Enter->top>MAX)
{Enter->top++;
Enter->stack[Enter->top]=p;//p指针后移
Return
(1);
}
Else//车进入便道
{t=(QueueNode*)malloc(sizeof(QueueNode));//分配存储空间
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return
(1);
}
}
(4).输出停车场中的车辆编号和到达时间的算法:
voidList1(SeqStackCar*S)/*列表显示车场信息*/
{inti=S.top;//出栈
cout<<”停车场中的车辆编号和到达时间”< While(i! =0) {cout< i--;} cout< } (6).输出便道中车辆编号和到达时间的算法: voidList2(LinkQueueCar*W)/*列表显示便道信息*/ {QueueNode*p; p=W->head->next;//指针p后移 if(W->head! =W->rear)/*判断通道上是否有车*/ cout<<”便道中等待车辆的号码”< while(p! =NULL)判断队列是否为空 {cout< p=p->next; } cout< } 3.函数的调用关系图 4.调试分析本程序中: 1.调试中遇到的问题及对问题的解决方法: (1)在函数调用时,实参和形参在位置和个数上不是一一对应的,解决的方法是删除被调函数PRINT()中的形参room. (2)在编程过程中出现括号不匹配的情况,检查是应使对应括号匹配。 2.车辆到达,离去时的时间复杂度均为: O(n)。 本程序空间复杂度为: O(n*n)。 5.测试结果 (1).输入车牌号及车辆到达信息: (2)输出到达车辆的位置及离去车辆在停车场中停留的时间和应交的费用: 6.源程序(带注释) #include"stdio.h" #include"stdlib.h" #include"string.h" #defineMAX3/*车库容量*/ #defineprice0.05/*每车每分钟费用*/ typedefstructtime {inthour; intmin; }Time;/*时间结点*/ typedefstructnode {charnum[10]; Timereach; Timeleave; }CarNode;/*车辆信息结点*/ typedefstructNODE {CarNode*stack[MAX+1]; inttop; }SeqStackCar;/*模拟车站*/ typedefstructcar {CarNode*data; structcar*next; }QueueNode; typedefstructNode {QueueNode*head; QueueNode*rear; }LinkQueueCar;/*模拟通道*/ voidInitStack(SeqStackCar*);/*初始化栈*/ intInitQueue(LinkQueueCar*);/*初始化便道*/ intArrival(SeqStackCar*,LinkQueueCar*);/*车辆到达*/ voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);/*车辆离开*/ voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/ voidmain() { SeqStackCarEnter,Temp; LinkQueueCarWait; intch; InitStack(&Enter);/*初始化车站*/ InitStack(&Temp);/*初始化让路的临时栈*/ InitQueue(&Wait);/*初始化通道*/ while (1) {printf("\n1.thecararrive"); printf("2.thecarleave"); printf("3.theschedule"); printf("4.out\n"); while (1) {scanf("%d",&ch); if(ch>=1&&ch<=4)break; elseprintf("\npleasechoose: 1|2|3|4."); } switch(ch) {case1: Arrival(&Enter,&Wait);break;/*车辆到达*/ case2: Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/ case3: List(Enter,Wait);break;/*列表打印信息*/ case4: exit(0);/*退出主程序*/ default: break; } } } voidInitStack(SeqStackCar*s)/*初始化栈*/ {inti; s->top=0; for(i=0;i<=MAX;i++) s->stack[s->top]=NULL; } intInitQueue(LinkQueueCar*Q)/*初始化便道*/ {Q->head->next=NULL; Q->rear=Q->head; return (1); } voidPRINT(CarNode*p)/*打印出栈车的信息*/ {introom; intA1,A2,B1,B2; printf("\npleaseinputthedeparttime: "); scanf("%d%d",&(p->leave.hour),&(p->leave.min)); printf("\nthenumberofthecar: "); puts(p->num); printf("\nthetimethecararrive: %d: %d",p->reach.hour,p->reach.min); printf("thedeparttime: %d: %d",p->leave.hour,p->leave.min); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; printf("\nthefee: %2.1fyuan",((B1-A1)*60+(B2-A2))*price); free(p); } intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/ {CarNode*p; QueueNode*t; p=(CarNode*)malloc(sizeof(CarNode)); flushall(); printf("\ninputthenumberofthecar: "); gets(p->num); if(Enter->top {Enter->top++; /*printf("\ntheplaceofthecar: ",Enter->top);*/ printf("\nthetimethecararrive: "); scanf("%d: %d",&(p->reach.hour),&(p->reach.min)); Enter->stack[Enter->top]=p; return (1); } else/*车场已满,车进便道*/ {printf("\ngaichexuzaibiandaodengdai! "); t=(QueueNode*)malloc(sizeof(QueueNode)); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t; return (1); } } voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W) {/*车辆离开*/ inti,room; CarNode*p,*t; QueueNode*q; /*判断车场内是否有车*/ if(Enter->top>0)/*有车*/ {while (1)/*输入离开车辆的信息*/ {printf("\nqingshuruchezaichechangdeweizhi/1--%d/: ",Enter->top); scanf("%d",&room); if(room>=1&&room<=Enter->top)break; } 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]; 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); /*判断通道上是否有车及车站是否已满*/ if((W->head! =W->rear)&&Enter->top {q=W->head->next; t=q->data; Enter->top++; printf("\nbiandaode%shaochejinruchechangdi%dweizhi",t->num,Enter->top); /*printf("\nqingshuruxianzaideshijian: ");*/ scanf("%d: %d",&(t->reach.hour),&(t->reach.min)); W->head->next=q->next; if(q==W->rear) W->rear=W->head; Enter->stack[Enter->top]=t; free(q); } elseprintf("]nbiandaolimeiyouche.\n"); } elseprintf("chechanglimeiyouche.");/*没车*/ } voidList1(SeqStackCar*S)/*列表显示车场信息*/ {inti; if(S->top>0)/*判断车站内是否有车*/ {printf("\nchechang: "); printf("\nweizhidaodashijianchepaihao\n"); for(i=1;i<=S->top;i++) {printf("%d",i); printf("%d: %d",S->stack[i]->reach.hour,S->stack[i]->reach.min); puts(S->stack[i]->num); } } elseprintf("\nchechanglimeiyouche"); } voidList2(LinkQueueCar*W)/*列表显示便道信息*/ {QueueNode*p; p=W->head->next; if(W->head! =W->rear)/*判断通道上是否有车*/ {printf("\ndengdaicheliandehaomawei: "); while(p! =NULL) {puts(p->data->num); p=p->next; } } elseprintf("\nbiandaolimeiyouche."); } voidList(SeqStackCarS,LinkQueueCarW) {intflag,tag; flag=1; while(flag) {printf("\nqingxuanze1|2|3: "); printf("\n1.chechang\n2.biandao\n3.fanhui\n"); while (1) {scanf("%d",&tag); if(tag>=1||tag<=3)break; elseprintf("\nqingxuanze1|2|3: "); } switch(tag) {case1: List1(&S);break;/*列表显示车场信息*/ case2: List2(&W);break;/*列表显示便道信息*/ case3: flag=0;break; default: break; } } } 总结 在这三周的数据结构课程设计中,我的题目是: 停车场管理,这三周课程设计中,通过该题目的设计过程,我加深了对数据结构中线性表及栈的逻辑结构,存储结构的理解,掌握了线性表及栈上基本运算的实现,进一步理解和掌握了课本中所学的各种数据结构,同时也加深了对C语言中知识的理解。 学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。 一个人要完成所有的工作是非常困难和耗时的。 在以后的学习中我会更加注意各个方面的能力的协调发展。 在课程设计时遇到了很多的问题,在老师和同学的帮助,和对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。 三周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,来配合学习,三周中我收益很大,学到很多。 附件Ⅰ部分源程序代码 归并排序算法: ProcedureMerge_Sort(a,c,NUM) n<-1 whilen callMerge_Pass(a,c,n,NUM)//以2*n间隔排序 n<-n*2 callMerge_Pass(c,a,n,NUM) n<-n*2 end end ProcedureMerge_Pass(a,c,n,NUM) fori<-0toNUM-2*nby2*ndo callMerge(a+I,n,a+i+n,n,c+i) end ifi+n callMerge(a+i,n,a+i+n,n,c+i) else forj<-ItoNUM-1doc(j)<-a(j) end end ProcedureMerge(a,m,b,n,c) i<-0;j<-0;k<-0 whilei ifa(i)<=b(j)then c(k)<-b(j) k<-k+1 j<-j+1 end end ifi whilei c(k)<-a(i) k<-k+1 i<-i+1 end else//把剩余的b[]加到c[]中 whilei c(k)<-b(i) k<-k+1 i<-i+1 end end end 归并程序如下: #include"stdio.h" voidMerge(inta[],intm,intb[],intn,intc[]) {inti=0,j=0,k=0; while(i if(a[i]<=b[j]) c[k++]=a[i++]; else c[k++]=b[j++]; if(i while(i c[k++]=a[i++]; else while(j c[k++]=b[j++]; } voidMerge_Pass(inta[],intc[],intn,intNUM) {inti,j; for(i=0;i<=NUM-2*n;i+=2*n)//以2*n间隔排序 Merge(a+i,n,a+i+n,n,c+i); if(i+n Merge(a+i,n,a+i+n,NUM-(i+n)-1,c+i);//把剩下的进行合并处理 else for(j=i;j c[j]=a[j]; } voidMerge_Sort(inta[],intc[],intNUM) {intn=1; while(n {Merge_Pass(a,c,n,NUM);//排序后加到c n*=2; Merge_Pass(c,a,n,NUM);//排序后加到a n*=2; } } voidmain()//主函数 {inta[9]={82,16,9,95,37,75,42,69,34,},b[9],i; Merge_Sort(a,b,11); for(i=0;i<9;i++) printf("%d",a[i]); } 程序运行结果如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场 管理 设计