Stange Parkinglot
问题简述
1、停车场设置
一个停车场,拥有3个停车位。停车场只有一个大门,且另外提供一条过道,可供4辆汽车临时停靠。
车辆在进入停车场时,只能从大门进入,从大门出去。若停车场内已经停满,则之后到来的车就只能停在门外的过道上等候。一旦停车场有空位,过道上的第一辆车就可进入停车场,过道只有一侧进入,另外一侧出去。当车辆离开时,在它之后开入的车辆必须退出停车场为它让路,当这辆车离开后,其余的车再按照原次序进入停车场。每辆停放在停车场的车离开时都必须按照停留时长进行缴纳费用。
用栈模拟停车场,用队列模拟过道,完成停车场的设置。
2.收费规则
每辆停在停车场的车,在离开停车场时,必须按照停留的时间长短缴纳费用。停车场按每小时5元计费,进出时间均为整数,不足一小时不收费,超过3h后每小时价格为10元。
3.实现功能
(1)车辆进入停车场(开始计时)
(2)车辆离开停车场(停止计时并计算费用)
(3)查看停车场(查看当前停车场的使用状态)
解决思路
本题要求利用数据结构:栈、队列来实现停车场。实现方法,题目描述已经十分清晰,考虑到停车场需要频繁地进出更改数据元素,我们采用链表来对栈和队列这两种逻辑结构进行实现。该题化简为栈和队列的创建、添加元素、删除元素、查找元素操作。结点可以用“车”这个结构体来实现。核心在于根据题目所要求的逻辑关系将停车场栈和过道队列连接起来,实现“出队列进栈”的操作。另外,在编程时还需考虑到各项操作执行的条件、操作之间的逻辑因果关系、输入的合法性来保障程序的健壮、可行,防止程序出错。另外计费这种操作只需通过time函数获取当前计算机时间存储、并在驶出时再次获取进行运算操作即可。为方便程序使用,添加一个menu菜单函数不停循环获取用户输入来进行对函数的选择调用。
基础逻辑以及判定条件
1.栈、队列的创建>栈、队列的操作
2.栈、队列是否为空(很重要,在栈和队列操作前进行判断)
3.过道有车->栈满
4.出栈->出队列、进栈
5.若队列有元素,才执行出队列、进栈(也对应判定条件2,栈、队列是否为空)
6.栈满->入队列
7.队列满->操作失败
8.输入不合法->操作失败
Site
代码(C):https://github.com/codeYu233/Study/tree/main/Strange%20Parkinglot
Note
获取计算机时间来计算费用有点费时,为方便测试代码是否可行,链接中有个后缀为test的源文件,该代码需要用户手动输入停入时间节点(使用过程中可输入),当前时间节点(在代码的开头有个全局变量),并直接返回驶出停车场所需的缴费金额。非test代码将每8s定义为程序中的1小时,若需更改为真正的1小时,只需将计算金额时的/8改为/3600(3600s一小时)。很多同学用VisualStudio,注意下VisualStudio近几年版本的安全函数问题(如scanf和scanf_s)另外注意下不同操作系统对于清空输入缓冲区的指令的不同,在macos上测试fflush()可以清空输入缓冲区,但是windows上似乎得用while()循环一个个删除:(