停车场管理系统报告
更新时间:2023-07-24 12:53:01 阅读量: 实用文档 文档下载
实验二 栈和队列及其应用
一、 实验题目:
栈和队列及其应用——停车场管理
二、 实验内容:
设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北段),若停车厂内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车迹可开入;停车场内某辆车要离开时,在它之后进入的车连必须先退出车厂为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车时必须按它停留的时间长短缴纳费用。编写按上述要求进行管理的模拟程序。
可以将停车场定义成一个顺序栈s0,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,所以必须有一个临时的顺序栈s1,存放让道的车辆。
当有车辆进停车场时,若栈s0不满,则直接进入栈s0;若栈s0满,则进入便道(链队列q)。若有s0中车辆x离开时,先让在x后面进栈的车从s0退栈并进入栈s1中,让x离开并收取停车费(在便道上停留的时间不收费),然后再把s1中所有元素退栈并重新进入s0栈,最后,将链队列q中的队头元素出队并进栈到s0中。
三、 程序源代码:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define car_stop_max 2
struct Time//定义时间类型结构体
{
int year;
int month;
int day;
int hour;
int miniute;
int second;
};
struct cars//定义汽车类型结构体 包括车牌号 时间
{
char *car_id;
Time car_time;
};
struct sqStack//建立汽车栈的指针
{
cars *base;
cars *top;
};
int InitStack(sqStack &s)//初始化汽车
{
s.base=(cars*)malloc((car_stop_max)*sizeof(cars));
if(!s.base)
{
return 1;
}
s.top=s.base;
return 0;
}
cars Get_Stack_top(sqStack s)//得到汽车栈顶元素
{
if(s.top==s.base)
{
printf("没有车");
exit(1);
}
else
return *(s.top-1);
}
void Push_car(sqStack &s ,cars e)//汽车栈插入新的汽车
{
if(s.top-s.base>=car_stop_max)
{
printf("停车满\n");
}
else
{
s.top->car_id=new char [15];
strcpy(s.top->car_id,e.car_id);
s.top->car_time=e.car_time;
s.top++;
}
}
void Pop_car(sqStack &s)//汽车栈的汽车离开
{
if(s.base==s.top)
printf("没有车");
else
s.top--;
}
typedef struct QNode//汽车队列结构体
{
cars date;
struct QNode *next;
}QNode,*QueuePtr;
struct LinkQueue//汽车队列指针
{
QueuePtr front;
QueuePtr rear;
};
int InitQueue(LinkQueue &Q)//汽车队列的初始化
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
{
printf("不能初始化队列");
exit(1);
}
Q.front->next=NULL;
return 0;
}
void EnQueue(LinkQueue &Q,QNode e)//汽车队列添加新元素
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
p->date.car_id=new char [15];
strcpy(p->date.car_id,e.date.car_id);
p->date.car_time=e.date.car_time;
Q.rear->next=p;
Q.rear=p;
}
int DeQueue(LinkQueue &Q)//删除汽车队头元素
{
if(Q.front==Q.rear)
{
printf("空车,不能删除");
exit(1);
}
QueuePtr p;
p=Q.front->next;
if(Q.front->next==Q.rear)
{
Q.rear=Q.front;
}
Q.front->next=p->next;
free(p);
return 0;
}
cars Get_Queue_top(LinkQueue &Q)//得到汽车队头元素
{
if(Q.front==Q.rear)
{
printf("空车");
exit(1);
}
else
return (Q.front->next->date);
}
void Get_time(int &year,int &month,int &day,int &hour ,int &miniute,int &second)//产生时间函数
{
time_t t = time(0);
char tmp[64];
strftime( tmp, sizeof(tmp), "%Y %m %d %X %A %j %z",localtime(&t) );
sscanf(tmp,"%d%d%d%d:%d:%d",&year,&month,&day,&hour,&miniute,&second);
}
void main()
{
int i,j=0;
int sum=0;
double money=5;
int Choose ;
char c;
char b[10];
cars e,e2;
cars *p;
e.car_id=new char[15];
QNode E,E2;
LinkQueue Q;
sqStack s1,s2;
InitQueue(Q);
InitStack(s1);
InitStack(s2);
printf(" 欢迎进入停车场管理系统\n");
printf(" 按1进入车辆 \n");
printf(" 按2离开车辆 \n");
printf(" 按0退出系统 \n");
printf("*************************************************\n");
printf("请输入您的选择 ");
scanf("%d",&Choose);
while(Choose!=0)
{
switch(Choose)
{
case 1:
printf("请输入你的车牌号 ");
i=0;
while((c=getchar())!=' ')
{
b[i++]=c;
}
b[i]='\0';
strcpy(e.car_id,b);
Get_time(e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second);
if(sum>=car_stop_max)
{
E.next=NULL;
E.date=e;
printf("停车场已停满。请您在便道等候。\n");
EnQueue(Q,E);
}
else
{
printf("您在%d 年%d月%d日 %d:%d:%d 时刻进入\n",e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second); //测试结果
Push_car(s1,e);
sum++;
}
printf("***************************************************\n");
printf("输入你的选择 ");
scanf("%d",&Choose);
break;
case 2:
printf("请输入出停车场的车牌号 ");
i=0;
while((c=getchar())!=' ')
{
b[i++]=c;
}
b[i]='\0';
strcpy(e.car_id,b);
Get_time(e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second);
p=s1.top;
j=0;
while(j<sum&&(strcmp((p-1)->car_id,e.car_id))!=0)
{
j++;
p--;
}
if(j<sum)
{
i=0;
money=((e.car_time.second-(p-1)->car_time.second)+(e.car_time.miniute-(p-1)->car_time.miniute)*60);
printf("车牌号为%s的车离开,缴纳费用%f元\n",b,money);
while(i<j)
{
e2=Get_Stack_top(s1);
Pop_car(s1);
Push_car(s2,e2);i++;
}
Pop_car(s1);
i=0;
while(i<j)
{
e2=Get_Stack_top(s2);
Pop_car(s2);
Push_car(s1,e2);i++;
}
sum--;//汽车总是要减少了
if(sum<car_stop_max&&(Q.front!=Q.rear) )
{
E2.date=Get_Queue_top(Q);
strcpy(e.car_id,E2.date.car_id);
Get_time(e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second);
DeQueue(Q);
Push_car(s1,e);
printf("您%s在%d 年%d月%d日 %d:%d:%d 时刻进入\n",e.car_id,e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second); //测试结果
sum++;
}
}
else
printf("此辆车不存在\n");
printf("***************************************************\n");
printf("输入你的选择 ");
scanf("%d",&Choose);
break;
case 0:
printf("您要离开此系统 ");break;
default:
{
printf("***************************************************\n");
printf("输入错误重新输入 ");
}
scanf("%d",&Choose);break;
}
}
}
四、 测试结果:
五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)
注:内容一律使用宋体五号字,单倍行间距
1)定义汽车类型的结构体,包括汽车车牌号为char*类型,进入停车场的时间 类型又是时间类型的结构体。用函数void Get_time(int &year,int &month,int &day,int &hour ,int &miniute,int &second)//产生时间函数,返回需要的时间。
2)初始化栈时, s.top=s.base;将两者的顺序写反了,造成建立的的失败;
3)定义结构体时,两个结构体类型的变量可以直接赋值,如果结构体中不包含数组类型的变量,如果结构体中有指针也可以直接赋值。但是如果其中一个指针发生改变,则另一个也要改变
4)用全局变量sum控制停车场中车的数量。如果车进入sum++,如果车要离开时则sum--;
5)删除队列中的元素时
if(Q.front->next==Q.rear)
{
Q.rear=Q.front;
}
Q.front->next=p->next;两句话不能颠倒
6)如果有汽车要离开时,要判断便道是否有车,如果有,则要进入停车场,并记录进入时间;
7)汽车进入停车场时,
void Push_car(sqStack &s ,cars e)//汽车栈插入新的汽车
{
if(s.top-s.base>=car_stop_max)
{
printf("停车满\n");
}
else
{
s.top->car_id=new char [15];
strcpy(s.top->car_id,e.car_id);
s.top->car_time=e.car_time;
s.top++;
}
}
要给汽车的车牌号记录,开辟空间来放字符串。
正在阅读:
停车场管理系统报告07-24
2016西综试题03-15
计算机在材料科学与工程中的应用A上机答案 - 图文10-12
拥抱阳光作文600字02-04
生石花图集03-14
五年级 语文《童年的朋友》的教案11-17
第2章 作业及参考答案09-05
15.1.3积的乘方公开课105-19
中南大学 科技英语考试试卷03-14
流体力学例题及思考题-第二章05-12
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 停车场
- 管理系统
- 报告
- 178例结素试验反应强度的临床分析
- 2015年人教版八年级数学下册《勾股定理》单元测试题
- MBTI十六种人格类型
- 华为统一通信解决方案V2.2_主打胶片_V1.0
- 5 kW 弧电源的设计与仿真
- 提高注汽锅炉热效率的新措施
- 学习型组织的五项修炼
- 2013-2014学年七年级英语上册 Unit 7 Days and Months单元综合检测试题 (新版)冀教版
- 已批准的动物性食品中最高残留限量规定
- 2009国考真题答案
- 道路交通事故人身损害赔偿费用质证要点
- 2011届高三地理二轮复习 专题一 地理图像的判读与应用(练习卷)
- 电大滴成本会计(机考准确率高)第二份
- 以日本地产泡沫历史为鉴
- 中级职称个人专业技术工作总结 Microsoft Word 文档
- ekr Pro Com60 连接CLS 600简易手册
- 小学语文知识大全-对联谜语
- 科学谋划 夯实提升 赢在高效
- 高考英语作文如何增加句子亮点
- 良好行为习惯养成教育