[数据结构实践项目]变态的停车场管理系统

项目简介

设停车场是一个可以停放 n 辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。

若车场内已停满 n 辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。

项目要求:试为停车场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停留的时间。

设计思路

停车场的管理流程如下:

1.检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
2.当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。

项目中设计到的数据结构

由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。
而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。
排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。

因此,本题求解过程中需用到两个栈和一个队列。栈和队列都既可以用顺序结构实现,也可以用链式结构实现。

程序清单

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。

每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费,停车场费用按照 1 小时 1.5元)。

实现代码

#include <stdio.h>
#define MAX 3//模拟停车场最多可停的车辆数
//车的必要信息的结构体
typedef struct{int number;int arrive_time;
}zanInode;
//进入停车场的处理函数
int push(zanInode * park,int *parktop,zanInode car){//如果停车场已满,该车需进入便道等待(先返回 -1 ,在主程序中处理)if ((*parktop)>=MAX) {printf("停车场已停满!需停到便道上.\n");return -1;}else{//否则将该车入栈,同时进行输出park[(*parktop)]=car;printf("该车在停车场的第 %d 的位置上\n",(*parktop)+1);(*parktop)++;return 1;}
}
//车从停车场中退出的处理函数
zanInode pop(zanInode *park,int *parktop,int carnumber,zanInode * location,int *locationtop){int i;//由于函数本身的返回值需要返回一辆车,所以需要先初始化一个zanInode thecar;thecar.number=-1;thecar.arrive_time=-1;//在停车场中找到要出去的车for (i=-1; i<(*parktop); i++) {if (park[i].number==carnumber) {break;}}//如果遍历至最后一辆车,还没有找到,证明停车场中没有这辆车if (i==(*parktop)) {printf("停车场中没有该车\n");}else{//就将该车移出停车场//首先将在该车后进入停车场的车全部挪至另一个栈中while ((*parktop)>i+1) {(*parktop)--;location[*locationtop]=park[*parktop];(*locationtop)++;}//通过以上的循环,可以上该车后的左右车辆全部移开,但是由于该车也要出栈,所以栈顶指针需要下移一个位置,当车进栈时,就直接覆盖掉了(*parktop)--;thecar=park[*parktop];//该车出栈后,还要将之前出栈的所有车,在全部进栈while ((*locationtop)>0) {(*locationtop)--;park[*parktop]=location[*locationtop];(*parktop)++;}}return thecar;
}int main(int argc, const char * argv[]) {//停车场的栈zanInode park[MAX];int parktop=0;//栈顶指针//辅助停车场进行挪车的栈zanInode location[MAX];int locationtop=0;//栈顶指针//模拟便道的队列zanInode accessroad[100];int front=0,rear=0;//队头和队尾指针char order;//进出停车场的输入命令int carNumber;//车牌号int arriveTime;//到停车场的时间int leaveTime;//离开停车场的时间int time;//车在停车场中逗留的时间int result;zanInode car;printf("有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):\n");while (scanf("%c",&order)) {if (order=='#') {break;}switch (order) {case 'A':printf("登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):\n");scanf("%d %d",&carNumber,&arriveTime);car.number=carNumber;car.arrive_time=arriveTime;//当有车想要进入停车场时,首先试图将该车进入停车场result=push(park, &parktop, car);//如果返回值为 -1 ,证明停车场已满,需要停在便道中if (result==-1) {//停在便道上accessroad[rear]=car;printf("该车在便道的第 %d 的位置上\n",rear+1-front);rear++;}break;case 'D':printf("出停车场的车的车牌号以及离开的时间:\n");scanf("%d %d",&carNumber,&leaveTime);//当有车需要出停车场时,调用出栈函数car=pop(park, &parktop, carNumber, location, &locationtop);//如果返回的车的车牌号为-1 ,表明在停车场中没有查找到要查找的车if (car.number!=-1) {//停留时间,等于进停车场的时间-time=leaveTime-car.arrive_time;printf("该车停留的时间为:%d 小时,应缴费用为:%f 元\n",time,time*1.5);//一旦有车离开停车场,则在便道中先等待的车就可以进入,进入时需设定车进入的时间if (front!=rear) {car=accessroad[front];printf("在便道上第1的位置上,车牌号为:%d 的车进停车场的时间为:\n",car.number);scanf("%d",&car.arrive_time);park[parktop]=car;front++;parktop++;}else{printf("便道上没有等待车辆,停车场不满!\n");}}break;default:break;}printf("\n有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):\n");scanf("%*[^\n]"); scanf("%*c");//清空缓冲区}return 0;
}

运行结果:


有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
A
登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):
633 6
该车在停车场的第 1 的位置上有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
A
登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):
634 7
该车在停车场的第 2 的位置上有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
A
登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):
635 8
该车在停车场的第 3 的位置上有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
A
登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):
636 9
停车场已停满!需停到便道上.
该车在便道的第 1 的位置上有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
D
出停车场的车的车牌号以及离开的时间:
633 10
该车停留的时间为:4 小时,应缴费用为:6.000000 元
在便道上第1的位置上,车牌号为:636 的车进停车场的时间为:
10有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
D
出停车场的车的车牌号以及离开的时间:
634 10
该车停留的时间为:3 小时,应缴费用为:4.500000 元
便道上没有等待车辆,停车场不满!有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
A
登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):
637 11
该车在停车场的第 3 的位置上有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):
#

[数据结构实践项目]变态的停车场管理系统相关推荐

  1. Springboot毕设项目酒店地下停车场管理系统47g66java+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目酒店地下停车场管理系统47g66java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + M ...

  2. 计算机课程设计收费管理系统,数据结构课程设计报告---收费停车场管理系统

    数据结构课程设计报告---收费停车场管理系统 (20页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 XX大学计算机与电子 信息学院< ...

  3. 数据结构实践项目——图的基本运算及遍历操作

    本文是针对[数据结构基础系列(7):图]中第1-9课时的实践项目. 0701 图结构导学 0702 图的定义 0703 图的基本术语 0704 图的邻接矩阵存储结构及算法 0705 图的邻接表存储结构 ...

  4. 停车场管理系统程序设计c语言数据结构,数据结构(C语言)—停车场管理系统...

    2014-01-02 回答 #include #include #include #include #define max 3 #define price 1 int b=1; typedef str ...

  5. 数据结构实验一(C语言):停车场管理系统

    停车场管理系统 一.实验目的 熟练掌握线性表的基本操作在顺序存储和链式存储上的实现: 以线性表的各种操作(建立.插入.删除.遍历等)的实现为重点: 掌握线性表的动态分配顺序存储结构的定义和基本操作的实 ...

  6. 数据结构 实践项目——数据结构、算法、程序设计

    [项目1 - C/C++语言中函数参数传递的三种方式] C语言提供了两种函数参数传递的方式:传值和传地址.在C++中,又拓展了引用方式.通过本项目,确认自己已经掌握了这三种方式的原理,为后续学习做好准 ...

  7. Java项目:JSP停车场管理系统

    作者主页:夜未央5788 简介:Java领域优质创作者.Java项目.学习资料.技术互助 文末获取源码 项目介绍 一款由jsp+servlet+mysql实现的小区物业停车管理系统,系统基本实现了小区 ...

  8. 数据结构实践项目:校园路线导航图

    题目: 23.校园路线导游系统 1.问题描述 用无向网表示东莞理工学院的校园景点平面图,图中顶点表示主要景点(要求包 含学校的大部分景点信息,包括教学楼,体育馆,食堂,学生宿舍,图书馆等信息), 存放 ...

  9. c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...

    <数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...

最新文章

  1. PO_标准内部请购内部采购单抛转订单模组(流程)
  2. 2016年 CodePen 最热门的前端代码 Top 100
  3. TesCase-GUI(图形用户界面)测试
  4. Spring Cron Expression
  5. Visual Studio + C# + Xamarin = iOS/Android/Windows Apps
  6. 【Spring】jpa数据库表实体命名规则 Unknown column ‘user0_.create_time‘ in ‘field list‘
  7. Android地图权限处理,Android 使用地图时的权限请求方法
  8. C++ 字节流与二进制字符串相互转换(一个简单的明文加解密程序)
  9. 在线图片水印平铺工具
  10. 采集网页数据生成到静态模板newslist.html文件中(正则表达式)
  11. Process p = new Process();
  12. [2018.10.11 T2] 整除
  13. 5G无线技术基础自学系列 | 5G NR和LTE信道结构比较
  14. 数据库之order by
  15. 【Django】admin.ModelAdmin的源码-20220105
  16. surface屏幕闪烁重影_如何解决surface重影surfacepro4屏幕抖动原因
  17. CodeChef 遇到 Language Rejected 怎么办
  18. 解决Centos7关闭You have new mail in /var/spool/mail/root提示
  19. 关于 [CSP-S 2022] 假期计划 的一些想法
  20. 数字图像处理必备软件

热门文章

  1. css-flex 经典面试题
  2. 统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数Java开方平方根
  3. STM32中AD转换的校准问题
  4. 《NFL橄榄球》:休斯敦得州人·橄榄1号位
  5. c++ for循环执行流程
  6. 网络统考计算机一年几次,网络教育统考一年考几次?考什么科目?
  7. Git指令 复制原分支代码到新分支
  8. 安全传输协议-TLS
  9. phpcms 提示信息页面跳转showmessage
  10. SQL Server实用经验技巧集