实验二栈和队列实验报告停车场问题.docx
- 文档编号:2438411
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:17
- 大小:117.96KB
实验二栈和队列实验报告停车场问题.docx
《实验二栈和队列实验报告停车场问题.docx》由会员分享,可在线阅读,更多相关《实验二栈和队列实验报告停车场问题.docx(17页珍藏版)》请在冰豆网上搜索。
实验二栈和队列实验报告停车场问题
数据结构实验报告
实验二栈和队列实验
班级:
计12-2姓名:
毛文祥学号12101020223
一.实验目的
熟悉栈和队列的基本特性,掌握栈和队列基本运算的实现过程。
重点掌握栈和队列各种操作的实现。
二.问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出,汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入,当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,试为停车场编制按上述要求进行管理的模拟程序。
三.需求分析
该停车场问题可以理解为栈和队列的结合,因为停车场内部是先进入的车辆放到最北面,之后进来的车辆依次排到南面,如果有车辆要出去,那么在它之后进入的车辆必须先退出,给这个车辆让路,这个车辆出去之后再返回到停车场,这就是栈的先进后出的操作一致,因此选择栈存储停车场内的车辆,而便道上的车辆则不同,便道上的车辆,进来之后就排在最西边,如果有车辆要出去,那么在它之前车辆必须依次排到队尾,之后这个车辆开出便道,这和队列的先进先出操作一致,因此用队列存储便道上的车辆。
四.系统设计
1.数据结构定义:
structPark
{
intstatus;//车的状态,0表示进入,1表示离开
intnum;//车的牌号
inttime;//车离开或者进入的时间
};//车的基本信息的结构体定义
typedefstruct
{
structPark*base;//栈底指针
structPark*top;//栈顶指针
intstacksize;
}SqStack;栈数据结构定义
队列数据结构类型定义
typedefstructQNode
{
structParkdata;//数据域
structQNode*next;
}QNode,*Queueptr;
typedefstruct
{
Queueptrfront;//队头指针
Queueptrrear;//队尾指针
}LinkQueue;
2.基本操作描述
voidInitStack(SqStack&S);
//初始化一个栈
voidPush(SqStack&S,structParke);
//压入一个栈顶元素
structParkGetTop(SqStack&S);
//得到栈顶元素,函数的返回值为存放车的信息的结构体变量
structParkPop(SqStack&S);
//删除栈顶元素,且函数的返回值为栈顶元素
intEmptyStack(SqStackS);
//判断一个栈是否为空,空返回1,非空返回0
voidVisitStack(SqStackS);
//遍历一个栈而且输出栈元素的信息,输出顺序为从栈底元素到栈顶元素
voidInitQueue(LinkQueue&Q);
//初始化一个队列
voidInsertQueue(LinkQueue&Q,structParke);
//在队列的队尾处中插入一个元素
voidDeleteQueue(LinkQueue&Q);
//删除队头元素
voidVisitQueue(LinkQueueQ);
//遍历队列,且输出队列元素信息,按照从队头到队尾的顺序输出
voidDQueue(LinkQueue&Q,structParke);
//在队列中删除元素信息的数据域中的num值和e的num相等的元素
intDStack(SqStack&S,structParkp,double&d);
//在栈中查找是否有与p的num值相等的元素,如果找到,改变d的值,函数值返回1,否则函数值返回0
3.主程序模块处理过程描述
首先输入该车辆信息,判断是否是输入结束标志,是则跳出循环,否则判断是否是进入的车辆,如果是进入的车辆,那么判断此时栈是否已经满了,如果此时栈已满,那么该车辆就要入队列,否则入栈。
如果该车辆是出去的,那么先判断该车辆是否是在栈中,如果是在栈中,那么直接在栈中删除即可,删除完之后还要检查此时队列是否为空,如果队列非空,那么队列的队头元素出队列压入栈中。
如果不在栈中,那么将该元素直接在队列中删除即可。
之后循环出来之后
输出要输出的三个信息。
下面为该过程的流程图描述:
Y
N
N
Y
YN
N
Y
Y
N
五.调试分析
源程序的修改:
intmain()
{
doubleprice;
structParkp;
inta[100],i=0,j;
doubleb[100];
scanf("%d%lf",&Length,&price);
SqStackS;
InitStack(S);//初始化一个栈
LinkQueueQ;
InitQueue(Q);//初始化一个队列
while
(1)
{
scanf("%d%d%d",&p.status,&p.num,&p.time);
if(!
p.status&&!
p.num&&!
p.time)break;
if(!
p.status)//如果此时车要进入,那么压栈
{
if(S.top-S.base==S.stacksize)//如果此时已经达到最大的限度,即此时栈已经满了,那么车辆就要开始入队列了,否则就入栈
{
InsertQueue(Q,p);
VisitQueue(Q);
}
else
Push(S,p);
}
else
{//此时元素要出去
if(DStack(S,p,b[i]))//如果这个元素在这里面删除了
{
b[i]*=price;
a[i]=p.num;
i++;
if(Q.rear!
=Q.front)//如果队列不为空,那么就写进来
{
Push(S,Q.front->next->data);//进栈
DeleteQueue(Q);//队列删除元素
VisitQueue(Q);
}
}
else
{
DQueue(Q,p);
VisitQueue(Q);
}
}
}
for(j=0;j
printf("%d%.2lf\n",a[j],b[j]);
VisitStack(S);
VisitQueue(Q);
return0;
}
以上过程为主函数,阴影部分为后来加上的操作,假如出去的车辆是栈中的元素,那么并不简简单单是把栈中的元素删除那么简单,还要把队列的队头元素压栈。
还有把scanf("%d%f",&Length,&price);改成scanf("%d%lf",&Length,&price);因为前一个操作会出现数据错误,price是double型,故必须用%lf的形式输入。
六.测试结果
输入:
21.5
015
0210
1115
0320
0425
0530
0635
1240
0745
1650
000
输出:
115.00
245.00
34
75
输入
53.5
010013
010025
010038
0100417
1100223
0100534
0100640
0100745
1100550
0100851
0100953
0101060
0101164
1101070
000
输出:
100263.00
100556.00
10011003100410061007
101110081009
七.基本操作的实现
voidInitStack(SqStack&S)
{//栈的初始化操作
if(!
(S.base=(structPark*)malloc(sizeof(structPark)*(Length+1))))
exit(0);//内存不够返回错误
//一开始为其分配其长度加1空间
S.top=S.base;
S.stacksize=Length;//但是这个长度还是Length
}//这样定义只是针对这个题来说的
voidPush(SqStack&S,structParke)
{//入栈操作
*S.top++=e;
//printf("入栈的车牌号为%d\n",e.num);
}
structParkGetTop(SqStack&S)
{//得到栈顶元素,用函数返回
if(S.base==S.top)
exit(0);
return*(S.top-1);
}
structParkPop(SqStack&S)
{//退栈操作,函数返回值为存储车辆信息的结构体变量
if(S.base==S.top)
exit(0);
//printf("出栈的车牌号为%d\n",(*(S.top-1)).num);
return*--S.top;
}
intEmptyStack(SqStackS)
{//判断栈是否为空
if(S.base==S.top)
return1;//栈为空
else
return0;//栈不为空
}
voidVisitStack(SqStackS)
{//栈的遍历
inta[100],i=0;
while(!
EmptyStack(S))
{
a[i++]=GetTop(S).num;
Pop(S);
}
for(i--;i>=0;--i)
printf("%d",a[i]);
printf("\n");
}//按照从栈底到栈顶的顺序输出车辆信息
voidInitQueue(LinkQueue&Q)
{//队列初始化
if(!
(Q.rear=(Queueptr)malloc(sizeof(QNode))))
exit(0);
Q.front=Q.rear;
Q.front->next=NULL;
}
voidInsertQueue(LinkQueue&Q,structParke)
{//插入队列元素
Queueptrq;
if(!
(q=(Queueptr)malloc(sizeof(QNode))))
exit(0);
q->data=e;
q->next=NULL;
Q.rear->next=q;
Q.rear=q;
//printf("入队的车牌号为%d\n",q->data.num);
}
voidDeleteQueue(LinkQueue&Q)
{//队列删除的基本操作
Queueptrp;
p=Q.front->next;
Q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 队列 报告 停车场 问题