数据结构停车场管理Word格式.docx
《数据结构停车场管理Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构停车场管理Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
S,n)
操作结果:
构造一个空栈S,该栈可存放n个元素
push(&
S,e)
初始条件:
栈S已存在。
在栈S的栈顶插入新的栈顶元素e。
pop(&
S,&
e)
删除S的栈顶元素,并以e返回其值。
DestroyStack(&
S)
销毁栈So
ClearStack(&
将S清为空栈。
StackLength(&
栈S已存在
返回栈S的长度
StackEmpty(&
若S为空栈,则返回TRUE否则返回FALSE
GetTop(S,&
若栈S不空,则以e返回栈顶元素。
StackTraverse(S,visit())
从栈底到栈顶依次对S中的每个元素调用函数visit()
}ADTstack1.2设定队列的抽象数据类型定义为:
ADTQueue{
D={ai|ai€ElemSet,i=1,2,…,n,n>
InitQueue(&
Q)
构造一个空队列Q
DestroyQueue(&
队列Q已存在
队列Q被销毁,不再存在
ClearQueue(&
队列Q已存在。
将Q清为空队列。
QueueEmpty(&
若Q为空队列,则返回TRUE否则返回FALSE
QueueLength(Q)
返回Q的元素个数,即队列的长度。
GetHead(Q,&
Q为非空队列。
用e返回Q的队头元素。
EnQueue(&
Q,e)
插入元素e为Q的新的队尾元素。
DeQueue(&
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){}
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);
停车场费率:
cinmoney;
while(exit!
=OK){
\n请输入车辆数据\nA到达D离去E结束:
);
cininfo;
请输入车辆牌照:
cinpass;
if(info=='
A'
||info=='
E'
)printf("
请输入进场时间:
cintimes
){exit=OK;
elseif(info=='
){
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){
停车位置(停车场内):
%d\n"
i);
Qnode*tp;
tp=Q.front;
if(tp==NULL){}
j=1;
while(tp!
=Q.rear){
tp=tp-next;
j++;
停车位置(便道):
j);
D'
noded;
inttp,counter=0;
do{
counter++;
tp=pop(s,d);
=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
push(temp,d);
d.passport=0;
}while(d.passport==0||countern);
elseif(info!
='
&
info!
){}
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
输出:
停车场容量:
停车场费率:
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