栈和队列及其应用——停车场管理.doc
文本预览下载声明
华北水利水电学院 数据结构 实验报告
2012~2013学年 第 二 学期 2012 计算机科学与技术 专业
班级: 2012196 学号: 40 姓名: 贾宁
实验二 栈和队列及其应用
实验题目:
栈和队列及其应用——停车场管理
实验内容:
设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北段),若停车厂内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车迹可开入;停车场内某辆车要离开时,在它之后进入的车连必须先退出车厂为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车时必须按它停留的时间长短缴纳费用。编写按上述要求进行管理的模拟程序。
可以将停车场定义成一个顺序栈s0,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,所以必须有一个临时的顺序栈s1,存放让道的车辆。
当有车辆进停车场时,若栈s0不满,则直接进入栈s0;若栈s0满,则进入便道(链队列q)。若有s0中车辆x离开时,先让在x后面进栈的车从s0退栈并进入栈s1中,让x离开并收取停车费(在便道上停留的时间不收费),然后再把s1中所有元素退栈并重新进入s0栈,最后,将链队列q中的队头元素出队并进栈到s0中。
程序源代码:
#include stdio.h
#include stdlib.h
#include Windows.h
#include time.h
#include string.h
#define SIZE 2 //停车场的停车位数量
#define PRICE 6 //按分钟计费
struct Car //车辆信息
{
int carId;
int inTime[3];
int outTime[3];
};
struct Time //时间
{
int hour;
int minute;
int second;
};
Time GetTime() //返回系统当前时间,返回值类型为Time型
{
time_t nowtime;
struct tm *gettime;
time(nowtime);
gettime=localtime(nowtime);
Time time;
time.hour=gettime-tm_hour;
time.minute=gettime-tm_min;
time.second=gettime-tm_sec;
return time;
}
struct StopStack //停车位信息
{
Car *base;
Car *top;
int stackSize; //停车场容纳汽车数量
int Count; //用来记录某车在车场中的车位序号,以及车场中已有的车辆数目
};
struct StopQueue //便道结点
{
Car data;
StopQueue *next;
};
struct LinkQueue //便道队列
{
StopQueue* front;
StopQueue* rear;
};
void InitStack(StopStack * S) //停车场位初始化,栈初始化(包括停车场和临时停车场的初始化)
{
S-base=(Car*)malloc(SIZE*sizeof(Car));
S-top=S-base;
S-stackSize=SIZE;
S-Count=0;
}
void InitQueue(LinkQueue *Q) //初始化带头结点的对列
{
Q-front=Q-rear=(StopQueue*)malloc(sizeof(StopQueue));
Q-rear-next=NULL;
}
//判断停车场是否为空
int IsEmptyStack(StopStack *S)
{
if(S-base==S-top)
return 1;
else return 0;
}
//判断车辆是否存在
int IsExist(StopStack *S,int num)
{
Car *p=S-top;
while(p!=S-base)
{
p--;
if(p-carId==num)
return 1;
}
return 0;
}
//进入主停车场时获取该车进去的时间
void InsertStack(StopStack *S,Car data) //向栈中添加元素,即进入主停车场
{
显示全部