数据结构 停车场管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告
题目:停车场管理姓名:袁韬博学号: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∈D, i=1,2,3,······,n }
基本操作:
initStack(&S,d)
操作结果:建立一个长度为d的空栈
Push(&S, &e, &d)
初始条件:栈已存在,长度为d
操作结果:如栈已满返回false,否则将e,压入栈中,返回true
Pop(&S, e)
初始条件:栈已存在
操作结果:如栈为空返回false,否则弹栈入e,返回true
2.设定队列的抽象数据类型定义
数据对象:D={a i|a i∈SStop,i=1,2,3,······,n}
数据关系:R={|a i∈D, i=1,2,3,······,n }
*SQTypeInit()
操作结果:建立一个空队列
InSQType(*q, &data)
初始条件:队列已存在
操作结果:将data压入队列之中
*OutSQType( *q)
初始条件:队列已存在
操作结果:弹出队列,返回其指针。
3.程序包含6个模块
1)主程序模块:包含栈与队列的对象建立,输入值的判断以及函数的实现
2)栈模块:实现停车场抽象数据类型
3)队列模块:实现便道抽象数据类型
4)函数模块:实现数据的输入,进入和离开的弹栈与压栈及输出操作三、详细设计
#include
#include
#include
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]; //分配队列neicun
int head; //定义队列头
int tail; //定义队列尾
};
SQType *SQTypeInit()//建立空队列
{
SQType * q; //定义队列指针
if(q=new SQType) //建立队列
{
q->head=0; //将队列的头的定为0
q->tail=0; //将队列的尾的定为0
return q; //返回队列指针
}
else
{
return NULL; //建立不成功返回NULL
}
}
int InSQType(SQType *q,SStop &data)//入队列操作
{
if(q->tail==100) //如果队列满返回"队列已满!操作失败!"
{
cout<<"队列已满!操作失败!"< 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; //分配不成功返回false S.top=S.base; //是栈顶指针等于栈底指针 return true; //建立成功返回ture } bool Push(Stop &S,SStop &e,int &d){ //压栈操作 if(S.top-S.base>=d)return false; //如果栈满返回false if(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; //如果栈为空返回false e=*--S.top; //弹栈并将其值赋给e return true; //返回true } int Scanf(SStop &e){ //输入数据操作 cin>>e.a; //输入操作 cin>>e.b; //输入车牌号 cin>>e.c; //输入进入或离开时间 e.d=0; return 0; }