数据结构停车场管理.docx
- 文档编号:9471700
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:12
- 大小:18.99KB
数据结构停车场管理.docx
《数据结构停车场管理.docx》由会员分享,可在线阅读,更多相关《数据结构停车场管理.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构停车场管理
数据结构停车场管理
数据结构停车场管理
2008-12-2617:
16
需求分析
本次数据结构课程设计的具体内容是停车场管理系统,该系统用栈结构模拟停车场,限定停车场的容量为n,用队列结构模拟等待的便道,空间不限制。
车辆的信息包括:
车牌号、汽车到达/离去标志、到达/离去时刻等。
按照从终端读入的数据序列进行模拟管理。
每辆车需要三个数据,其中车辆数据为:
A表示到达,D表示离去,E表示程序结束。
车辆牌照为整型数据。
进场或离场时间同样为整型数据。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
停车场管理系统主要实现以下几个功能:
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
(2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。
(3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车场的调度功能。
该程序设计可以完整的模拟停车场的管理过程。
概要设计
1)为了实现上述程序功能,需要定义结构体数组和链表的抽象数据类型:
ADTstack{
数据对象:
D={ai|ai€charset,i=1,2,…,n,n>0}
数据关系:
R仁{|ai-1,ai€D,i=2…,n}
基本操作:
initstack(&S,n)
操作结果:
构造一个空栈S,该栈可存放n个元素
push(&S,e)
初始条件:
栈S已存在。
操作结果:
在栈S的栈顶插入新的栈顶元素e。
pop(&S,&e)
初始条件:
栈S已存在。
操作结果:
删除S的栈顶元素,并以e返回其值。
DestroyStack(&S)
初始条件:
栈S已存在。
操作结果:
销毁栈So
ClearStack(&S)
初始条件:
栈S已存在。
操作结果:
将S清为空栈。
StackLength(&S)
初始条件:
栈S已存在
操作结果:
返回栈S的长度
StackEmpty(&S)
初始条件:
栈S已存在。
操作结果:
若S为空栈,则返回TRUE否则返回FALSE
GetTop(S,&e)
初始条件:
栈S已存在。
操作结果:
若栈S不空,则以e返回栈顶元素。
StackTraverse(S,visit())
初始条件:
栈S已存在。
操作结果:
从栈底到栈顶依次对S中的每个元素调用函数visit()
}ADTstack1.2设定队列的抽象数据类型定义为:
ADTQueue{
数据对象:
D={ai|ai€ElemSet,i=1,2,…,n,n>0}
数据关系:
R仁{|ai-1,ai€D,i=2…,n}
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q
DestroyQueue(&Q)
初始条件:
队列Q已存在
操作结果:
队列Q被销毁,不再存在
ClearQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
将Q清为空队列。
QueueEmpty(&Q)
初始条件:
队列Q已存在。
操作结果:
若Q为空队列,则返回TRUE否则返回FALSE
QueueLength(Q)
初始条件:
队列Q已存在。
操作结果:
返回Q的元素个数,即队列的长度。
GetHead(Q,&e)
初始条件:
Q为非空队列。
操作结果:
用e返回Q的队头元素。
EnQueue(&Q,e)
初始条件:
队列Q已存在。
操作结果:
插入元素e为Q的新的队尾元素。
DeQueue(&Q,&e)
初始条件:
Q为非空队列。
操作结果:
删除Q的队头元素,并用e返回其值
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空。
visit()。
操作结果:
从队头到队尾,依次对Q的每个数据元素调用函数一旦visit()失败,则操作失败。
}ADTQueue2)本程序图示结构
(保密)
详细设计
1.车辆信息类型
typedefstructnode{
intpassport;//存储车辆牌照信息
inttime;//存储进场时间信息
}node;
2.栈类型(停车场)
typedefstructstack{
node*base;
node*top;
intstacksize;
}stack;
voidinitstack(stack&S,intn){〃构造空栈
S.top=S.base;
S.stacksize=n;
}
voidpush(stack&S,nodee){〃入栈函数
if((S.top-S.base)=S.stacksize){EnQueue(Q,e);}//如果栈满,调用入
队函数
else{
S.top-passport=e.passport;
S.top-time=e.time;
S.top++;
}
}
intpop(stack&S,node&e){〃出栈函数
if(S.top==S.base)returnERROR;//如果栈空,返回ERROR
--S.top;
e.passport=S.top-passport;
e.time=S.top-time;
returnOK;
}
3.队列类型(便道)
typedefstructQnode{
nodeQdata;
structQnode*next;
}Qnode;
typedefstruct{
Qnode*front;
Qnode*rear;
}LinkQueue;
voidEnQueue(LinkQueue&Q,nodee){〃入队函数
Qnode*q;
q=(Qnode*)malloc(sizeof(Qnode));
q-Qdata.passport=e.passport;
q-Qdata.time=e.time;
q-next=NULL;
if(count==O){Q.front=q;count++;}//若创建节点前队空,头指针指向
节点
Q.rear-next=q;
Q.rear=q;
}
voidDeQueue(LinkQueue&Q,node&e){//出队函数
if(Q.rear==NULL){}
else{
e.passport=Q.front-Qdata.passport
e.time=Q.front-Qdata.time;
count=0;}
Q.front=Q.front-next;
if(Q.front==NULL){Q.rear=Q.front
}
}
4.全局变量及编译预处理语句
#defineERROR0
#defineOK1
#defineNULL0
intcount=O;//队列是否为空的标志
inttimes;
stacks,temp;//初始化栈
LinkQueueQ;//初始化队列
5.主函数及其他函数的C+h算法
voidmain(){
intn,exit
floatmoney;
charinfo;
intpass;
Q.front=NULL;
Q.rear=(Qnode*)malloc(sizeof(Qnode));
Q.rear-next=Q.rear;
printf("停车场容量:
");
cinn;
initstack(s,n);
initstack(temp,n);
printf("停车场费率:
");
cinmoney;
while(exit!
=OK){
printf("\n请输入车辆数据\nA到达D离去E结束:
");
cininfo;
printf("请输入车辆牌照:
");
cinpass;
if(info=='A'||info=='E')printf("请输入进场时间:
");
cintimes
if(info=='E'){exit=OK;}
elseif(info=='A'){
inti,j;
nodea;
a.passport=pass;
a.time=times;
push(s,a);
for(i=1;i=n;i++){
if(s.base[i-1].passport==a.passport){
printf("停车位置(停车场内):
%d\n",i);
}
}
Qnode*tp;
tp=Q.front;
if(tp==NULL){}
else{
j=1;
while(tp!
=Q.rear){
tp=tp-next;
j++;
}
printf("停车位置(便道):
%d\n",j);
}
}
elseif(info=='D'){
noded;
inttp,counter=0;
do{
counter++;
tp=pop(s,d);
while(tp!
=ERROR){
if(d.passport==pass){
floatm;
m=(times-d.time)*money;
printf("停留时间:
%(需交费:
%f\n",times-d.time,m);
while(temp.base!
=temp.top){
pop(temp,d);
push(s,d);
}
wait(s);
d.passport=9999;
tp=ERROR
}
else{
push(temp,d);
d.passport=0;
tp=ERROR
}
}
}while(d.passport==0||countern);
}
elseif(info!
='A'&&info!
='D'&&info!
='E'){}
}
}
voidwait(stack&S){
!
=0){
if((S.top-S.base)==(S.stacksize-1)&&count
nodetemp;
DeQueue(Q,temp);
temp.time=times;
push(S,temp);
}
调试分析
(1)一开始在调试程序时遇到了内存错误,经过DEBU,找到了引起内存错误的原因:
即在建立队头指针与队尾指针时没有对指针进行初始化(没有为指针动态分配空间)。
问题得到解决。
⑵在Wait函数中的If语句处,一开始的算法有些问题,导致实现的功能与设想的有出入,无法得到正确的结果。
原条件为:
S.top-S.base==S.stacksize
后改为:
(S.top-S.base)==(S.stacksize-1)&&count!
=0
该函数的功能得以正确实现。
(3)在EnQueue函数中,一开始用的是建立实体结点,用队头队
尾指针指向该实体的方法来创建队列。
在调试过程中发现,忽略了生存期,导致队列并没有被创建。
改为创建指针,并为指针分配空间,再给头指针和尾指针赋值的方式解决问题。
虽然指针也有生存期,但为它分配的空间却并没有被收回,于是队列创建成功,问题解决。
⑷本程序中:
车辆到达,离去时的时间复杂度均为:
0(n)。
本程序空间复杂度为:
0(n)。
(5)经验体会:
借助DEBUG口Watch,可以更快的找到程序中的非语法错误。
在声明一个指针后,要对指针进行初始化,并且0可以作为地址使用。
注意生
存期对程序的影响。
用户使用说明
(1)输入车辆数据:
A为到达,D为离去,E为结束程序。
(2)接着输入车辆的牌照信息
(3)若为到达的车辆,输入进场信息,若为离去的车辆,输入离场信息。
(4)若车辆到达,可得到车辆的停放位置信息,若车辆离去,可得到车辆的停放时间(在便道上的停放时间除外),以及应该交纳的费用。
(5)本程序不断循环要求输入车辆信息,直到输入的车辆数据为E时,程序
结束。
测试结果
测试数据:
设n=2
输入数据:
2
输出:
停车场容量:
2
停车场费率:
6A,1,5停车位置(停车场内):
1A,2,10停车位置(停车场内):
2D,1,15停留时间:
10需交费:
60.00A,3,20停车位置(停车场内):
2A,4,25停车位置(便道):
1A,5,30停车位置(便道):
2D,2,35停留时间:
25需交费:
150.00D,4,40停留时间:
5需交费:
30.00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 停车场 管理