python实现停车场管理系统

需求

停车场管理系统:若车辆到达,则显示汽车在停车场内或便道上的停车位置:若车辆离去,则显示汽车在停车场内停留的时间和应缴纳的费用,在便道停留不收费。
基本要求:
(1)要求处理的数据元素包括三个数据项:汽车“到达”或“离去”信息,汽车牌照号码及到达或离去的时刻:
(2)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理;
(3)栈以顺序结构实现,队列以链表实现。

代码

# -*- coding : utf-8 -*-
# @Author :shangyi
# @File : Text3.1.py
# @Software : PyCharm
import datetime

#存放进停车场的车牌和进入时间
idtime = {}

#存放进停车场外面通道的车牌和进入时间
idtime1 = {}

#用队列模拟停车场外便道
class Head:
    def __init__(self):
        self.left = None
        self.right = None


class Node:
    def __init__(self, value):
        self.value = value
        self.next = None


class Queue:
    def __init__(self):
        # 初始化节点
        self.head = Head()

    def enqueue(self, value):
        # 插入元素,先新建一个结点
        newnode = Node(value)
        p = self.head
        if p.right:
            # 如果head结点的右边不为None
            # 说明队列中已经有元素了

            temp = p.right
            p.right = newnode
            temp.next = newnode
        else:
            # 队列为空,插入第一个元素
            p.right = newnode
            p.left = newnode

    def dequeue(self):
        p = self.head
        if p.left and (p.left == p.right):
            # 这说明队列中已经有元素
            # 但是这是最后一个元素
            temp = p.left
            p.left = p.right = None
            return temp.value
        elif p.left and (p.left != p.right):
            # 说明队列中有元素,而且不止一个
            temp = p.left
            p.left = temp.next
            return temp.value

        else:
            # 队列为空,抛出查询错误
            raise LookupError('queue is empty')

    def is_empty(self):
        if self.head.left:
            return False
        else:
            return True

    def top(self):
        # 查询目前队列中最早入队的元素
        if self.head.left:
            return self.head.left.value
        else:
            raise LookupError('queue is empty')

# 定义车辆
class car:
    #车牌
    licensePlate = ""
    #空余车位
    free_parking = 2
    #通道空余位置
    free_site = 2
    #用户选择
    def user(self):
        print('欢迎使用该停车系统:输入1停车,2离开,3退出')
        a = int(input())
        return a

    def entering(self):

        if(car.free_parking<=0):
            print("车位已满,请到在通道等候!")
            if (car.free_site <= 0):
                print("通道区已满,请误进入")
                return 0,0
            else:
                car.licensePlate = input("请输入你的车牌号:")
                car.free_site-=1

                enter_time_hour = datetime.datetime.now().hour
                enter_idtime = {car.licensePlate: enter_time_hour}

                # 判断车辆是否已经在停车场中
                while car.licensePlate in idtime1:
                    print("你输入的车牌有误,该车辆已经在停车场通道中!")
                    car.licensePlate = input("请输入你的车牌号:")
                # 把车辆信息输入到车辆列表内
                else:
                    idtime1.update(enter_idtime)
                    #print(idtime1)

                # 返回1,说明可以进入停车场外通道
                id = car.licensePlate
                return 1,id
        else:
            car.licensePlate = input("请输入你的车牌号:")
            #获取当前电脑日期和时间
            # enter_time_date = datetime.datetime.now().day
            enter_time_hour = datetime.datetime.now().hour
            enter_idtime = {car.licensePlate:enter_time_hour}

            #判断车辆是否已经在停车场中
            while car.licensePlate in idtime:
                print("你输入的车牌有误,该车辆已经在停车场中!")
                car.licensePlate = input("请输入你的车牌号:")
            #把车辆信息输入到车辆列表内
            else:
                idtime.update(enter_idtime)
                #print(idtime)
            #空闲车位减少一个
            car.free_parking -= 1
            #返回2,成功停车
            id = car.licensePlate
            return 2,id

    #离开方法
    def leaving(self):
        car.licensePlate = input("请输入你的车牌号:")
        #不要定义在循环里面
        leave_time_date = datetime.datetime.now().day
        leave_time_hour = datetime.datetime.now().hour

        print(leave_time_date,"日",leave_time_hour,"时离开")

        if car.licensePlate in idtime: #是否在停车场
            return 1,car.licensePlate,leave_time_hour
        elif car.licensePlate in idtime1: #是否在停车通道
            return 2,car.licensePlate
        else:
            print("该车辆不在该停车场或通道中,请重新输入你的车牌,或者退出程序!")
            return 0,car.licensePlate


if __name__ == '__main__':
    # 用栈模拟停车场
    parking_lot = []

    # 停车通道
    queue = Queue()

    # 主程序
    while True:
        choose = car().user()
        if choose == 1:
            enter = car().entering()
            if(enter[0]==1):
                print("停入停车场外通道")
                queue.enqueue(enter[1])
                # print(queue.top())
            elif(enter[0]==2):
                print("成功停车")
                parking_lot.append(enter[1])
                print("在停车辆:",parking_lot)
            else:
                print("请去往其他停车场")

        elif choose == 2:
            leave = car().leaving()
            # 在停车场,按照栈的先进后出,计算停车费
            if(leave[0]==1):
                temp=parking_lot[-1]
                print("在停车辆:",parking_lot)
                if leave[1] == temp:
                    print("停车费:",(leave[2]-idtime[car.licensePlate])*5+5,"元")
                    idtime.__delitem__(car.licensePlate)
                    car.free_parking+=1
                    parking_lot.pop()
                    print("成功离开停车场")
                else:
                    print("堵车了,无法离开")
            # 在通道,按照队列的先进先出
            elif(leave[0]==2):
                temp = queue.top()
                if leave[1] == temp:
                    idtime1.__delitem__(car.licensePlate)
                    car.free_site+=1
                    queue.dequeue()
                    print("成功离开通道")
                else:
                    print("堵车了,无法离开")

        else:
            print("欢迎下次使用!")
            break

  • 11
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓宜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值