需求
停车场管理系统:若车辆到达,则显示汽车在停车场内或便道上的停车位置:若车辆离去,则显示汽车在停车场内停留的时间和应缴纳的费用,在便道停留不收费。
基本要求:
(1)要求处理的数据元素包括三个数据项:汽车“到达”或“离去”信息,汽车牌照号码及到达或离去的时刻:
(2)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理;
(3)栈以顺序结构实现,队列以链表实现。
代码
1. # -*- coding : utf-8 -*- 2. # @Author :shangyi 3. # @File : Text3.1.py 4. # @Software : PyCharm 5. import datetime 6. 7. #存放进停车场的车牌和进入时间 8. idtime = {} 9. 10. #存放进停车场外面通道的车牌和进入时间 11. idtime1 = {} 12. 13. #用队列模拟停车场外便道 14. class Head: 15. def __init__(self): 16. self.left = None 17. self.right = None 18. 19. 20. class Node: 21. def __init__(self, value): 22. self.value = value 23. self.next = None 24. 25. 26. class Queue: 27. def __init__(self): 28. # 初始化节点 29. self.head = Head() 30. 31. def enqueue(self, value): 32. # 插入元素,先新建一个结点 33. newnode = Node(value) 34. p = self.head 35. if p.right: 36. # 如果head结点的右边不为None 37. # 说明队列中已经有元素了 38. 39. temp = p.right 40. p.right = newnode 41. temp.next = newnode 42. else: 43. # 队列为空,插入第一个元素 44. p.right = newnode 45. p.left = newnode 46. 47. def dequeue(self): 48. p = self.head 49. if p.left and (p.left == p.right): 50. # 这说明队列中已经有元素 51. # 但是这是最后一个元素 52. temp = p.left 53. p.left = p.right = None 54. return temp.value 55. elif p.left and (p.left != p.right): 56. # 说明队列中有元素,而且不止一个 57. temp = p.left 58. p.left = temp.next 59. return temp.value 60. 61. else: 62. # 队列为空,抛出查询错误 63. raise LookupError('queue is empty') 64. 65. def is_empty(self): 66. if self.head.left: 67. return False 68. else: 69. return True 70. 71. def top(self): 72. # 查询目前队列中最早入队的元素 73. if self.head.left: 74. return self.head.left.value 75. else: 76. raise LookupError('queue is empty') 77. 78. # 定义车辆 79. class car: 80. #车牌 81. licensePlate = "" 82. #空余车位 83. free_parking = 2 84. #通道空余位置 85. free_site = 2 86. #用户选择 87. def user(self): 88. print('欢迎使用该停车系统:输入1停车,2离开,3退出') 89. a = int(input()) 90. return a 91. 92. def entering(self): 93. 94. if(car.free_parking<=0): 95. print("车位已满,请到在通道等候!") 96. if (car.free_site <= 0): 97. print("通道区已满,请误进入") 98. return 0,0 99. else: 100. car.licensePlate = input("请输入你的车牌号:") 101. car.free_site-=1 102. 103. enter_time_hour = datetime.datetime.now().hour 104. enter_idtime = {car.licensePlate: enter_time_hour} 105. 106. # 判断车辆是否已经在停车场中 107. while car.licensePlate in idtime1: 108. print("你输入的车牌有误,该车辆已经在停车场通道中!") 109. car.licensePlate = input("请输入你的车牌号:") 110. # 把车辆信息输入到车辆列表内 111. else: 112. idtime1.update(enter_idtime) 113. #print(idtime1) 114. 115. # 返回1,说明可以进入停车场外通道 116. id = car.licensePlate 117. return 1,id 118. else: 119. car.licensePlate = input("请输入你的车牌号:") 120. #获取当前电脑日期和时间 121. # enter_time_date = datetime.datetime.now().day 122. enter_time_hour = datetime.datetime.now().hour 123. enter_idtime = {car.licensePlate:enter_time_hour} 124. 125. #判断车辆是否已经在停车场中 126. while car.licensePlate in idtime: 127. print("你输入的车牌有误,该车辆已经在停车场中!") 128. car.licensePlate = input("请输入你的车牌号:") 129. #把车辆信息输入到车辆列表内 130. else: 131. idtime.update(enter_idtime) 132. #print(idtime) 133. #空闲车位减少一个 134. car.free_parking -= 1 135. #返回2,成功停车 136. id = car.licensePlate 137. return 2,id 138. 139. #离开方法 140. def leaving(self): 141. car.licensePlate = input("请输入你的车牌号:") 142. #不要定义在循环里面 143. leave_time_date = datetime.datetime.now().day 144. leave_time_hour = datetime.datetime.now().hour 145. 146. print(leave_time_date,"日",leave_time_hour,"时离开") 147. 148. if car.licensePlate in idtime: #是否在停车场 149. return 1,car.licensePlate,leave_time_hour 150. elif car.licensePlate in idtime1: #是否在停车通道 151. return 2,car.licensePlate 152. else: 153. print("该车辆不在该停车场或通道中,请重新输入你的车牌,或者退出程序!") 154. return 0,car.licensePlate 155. 156. 157. if __name__ == '__main__': 158. # 用栈模拟停车场 159. parking_lot = [] 160. 161. # 停车通道 162. queue = Queue() 163. 164. # 主程序 165. while True: 166. choose = car().user() 167. if choose == 1: 168. enter = car().entering() 169. if(enter[0]==1): 170. print("停入停车场外通道") 171. queue.enqueue(enter[1]) 172. # print(queue.top()) 173. elif(enter[0]==2): 174. print("成功停车") 175. parking_lot.append(enter[1]) 176. print("在停车辆:",parking_lot) 177. else: 178. print("请去往其他停车场") 179. 180. elif choose == 2: 181. leave = car().leaving() 182. # 在停车场,按照栈的先进后出,计算停车费 183. if(leave[0]==1): 184. temp=parking_lot[-1] 185. print("在停车辆:",parking_lot) 186. if leave[1] == temp: 187. print("停车费:",(leave[2]-idtime[car.licensePlate])*5+5,"元") 188. idtime.__delitem__(car.licensePlate) 189. car.free_parking+=1 190. parking_lot.pop() 191. print("成功离开停车场") 192. else: 193. print("堵车了,无法离开") 194. # 在通道,按照队列的先进先出 195. elif(leave[0]==2): 196. temp = queue.top() 197. if leave[1] == temp: 198. idtime1.__delitem__(car.licensePlate) 199. car.free_site+=1 200. queue.dequeue() 201. print("成功离开通道") 202. else: 203. print("堵车了,无法离开") 204. 205. else: 206. print("欢迎下次使用!") 207. break