【卡码网Python基础课 20.排队取奶茶】


题目描述与分析

题目描述:
假设有一家奶茶店,现在有一些人在排队等待取奶茶,同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。
假设每个人取奶茶的时间非常短,可以忽略不计,只需要考虑队列中的操作。
队列操作说明:
1.当操作为 1 时,表示有人已经取走奶茶,从队列中删除该人的信息。
2.当操作为 2 时,表示有新人加入排队,将该人的信息加入队列。
在一系列操作之后,你需要回答:下一个取奶茶的人是谁?

输入描述:
第一行有一个整数 n,代表初始队列有 n 个人。

第二行有 n 个字符串,代表当前奶茶队列中的人。

第三行为一个整数 m,代表接下来将会有 m 次操作。

接下来一共有 m 行,代表共有 m 次操作。

如果是操作 1,那么该行只会有一个数字,代表有人取走了奶茶。
如果是操作 2,那么该行有一个数字和一个字符串,第一个数字 2 表示有人加入了奶茶队列,第二个字符串代表新加入的奶茶队列的人。

输出描述:
第一行有一个整数 n,代表初始队列有 n 个人。
第二行有 n 个字符串,代表当前奶茶队列中的人。
第三行为一个整数 m,代表接下来将会有 m 次操作。
接下来一共有 m 行,代表共有 m 次操作。
如果是操作 1,那么该行只会有一个数字,代表有人取走了奶茶。
如果是操作 2,那么该行有一个数字和一个字符串,第一个数字 2 表示有人加入了奶茶队列,第二个字符串代表新加入的奶茶队列的人。

输出描述:
输出只有一行,为下一个取奶茶的人。 如果已经没有去奶茶的人了,输出“There are no more people in the queue.”。

输入示例:

5
Giselle Winter Aubree Wrenley Royalty
3
1
1
2 Andrew

输出示例:

Aubree

一、队列

队列,顾名思义,和排队的队列结构是类似的,在排队的过程中,想要加入队列,需要在队伍的最后一位(也被称为队尾)入队,想要离开队列,需要从队伍的第一位(也被称为队头)出队。
在这里插入图片描述
从图中可以看出,队列在队尾那一侧进行插入操作(入队),在队头那一侧进行删除操作(出队),而且是先进先出 FIFO(最先进入队列的元素将首先被移除)。

队列在计算机科学中的应用十分广泛,例如:
事件处理系统:在事件驱动的程序中,事件或消息通常被放入队列中,等待进一步处理。
任务调度:操作系统使用队列来管理和调度任务或进程。
资源共享:如打印机队列等,资源的共享可以通过队列来管理请求的先后顺序。
数据缓冲:如网络数据的缓冲,队列可以帮助管理数据流和处理顺序。
宽度优先搜索(BFS):在图和树的搜索算法中,使用队列来追踪待处理的节点。

二、队列的操作

在 Python 语言中,标准库中的queue模块提供了多种队列的实现,比如普通队列和优先级队列,因此你可以使用queue.Queue类来创建队列,不过我们依旧可以使用列表来模拟队列的实现。

队列的常用操作主要有以下几种:
获取队列的长度,即队列中元素的数量,通常使用列表的len()函数来获取
判断队列是否为空,可以通过if not queue来判定
入队操作,将新的元素添加到队列的尾部,使用列表的append()函数来实现
出队操作,获取并移除队列的头部元素,可以通过pop(0)函数传递索引来实现。
访问队列的头部元素,但不会将其移除,使用索引访问第一个元素queue[0]

# 导入queue模块
import queue

# 创建一个队列
q = queue.Queue()

# 通过put()实现入队操作
q.put(1)
q.put(2)
q.put(3)

# 通过get()实现出队操作
item = q.get()  # 出队并返回队列中的元素
print(item)  # 输出 1

下面给出的示例则展示了如何通过列表模拟队列

ueue = []

# 入队操作
queue.append("Tom")
queue.append("Jerry")
queue.append("Mike")

# 出队操作
removed_person = queue.pop(0)  # 弹出并返回队列中的第一个元素

# 判断队列是否为空:
if not queue:
    print("队列为空")
else:
    print(f"队头元素: {queue[0]}")

三、代码编写

照例, 第一行要接收整数 n 的输入,表示队列中有 n 个人, 然后接收一行字符串作为输入,表示取奶茶的人,将之切割成列表。

# 整数 n 表示列表有n个人
n = int(input())
# 将输入字符串分割成列表
queue = input().split()

队列已经构建完毕,接下来需要接收数字 m 和 m 个整数的输入,表示取奶茶的操作,如果数字为 1,表示有人取走了奶茶,即出队操作,如果数字为 2,表示有人新加入了奶茶队列,即入队操作,这种“如果”的条件,需要使用到if-else结构

# 读取操作次数
m = int(input())
# 循环处理每次操作
for _ in range(m):
    # 获取对队列的操作以及编号,可能有1位数字或者两位数字,将之拆分成列表
    operation = input().split()
    # 第一位数字表示对队列的操作
    opt = int(operation[0])
    # 如果数字为1,表示有人取走了奶茶
    if opt == 1:
        # 出队操作
    # 如果数字为2,表示有人新加入了奶茶队列
    elif opt == 2:
        # 入队操作

注意上述操作中,需要考虑出队操作中队列是否为空的情况,当且仅当“操作指令为出队,队列中的元素不为空,即if queue为True时”才能出队。
出队操作使用pop(0)从列表中移除最后一个元素即可,而入队操作需要使用append()函数

# 操作1: 有人取走了奶茶
if opt == 1:
    if queue:
        # 通过pop(0)操作移除列表的第一个元素
        removed_person = queue.pop(0)  # 出队
# 操作2: 有人新加入了队列
elif opt == 2:
    # 获取新加入队列的人的名称
    new_person = operation[1]
    # 通过append()操作向队列中添加元素
    queue.append(new_person)  # 入队

当执行完所有操作后,如果队列为空,说明没有取奶茶的人,输出“There are no more people in the queue…”,如果仍有元素,则输出下一个取奶茶的人。

# 判断队列是否为空
if not queue:
    print("There are no more people in the queue.")
else:
    print(queue[0])  # 取出队头元素,即列表的第一个元素

完整代码如下:

# 读取初始队列长度
n = int(input())
# 读取初始队列中的排队名称
queue = input().split()

# 读取操作次数
m = int(input())
# 循环处理每次操作
for _ in range(m):
    operation = input().split()
    opt = int(operation[0])

    if opt == 1:
        # 操作1: 出队
        if queue:
            removed_person = queue.pop(0)  # 出队,移除列表的第一个元素
    elif opt == 2:
        # 操作2: 入队
        new_person = operation[1]
        queue.append(new_person)  # 入队
# 判断队列是否为空
if not queue:
    print("There are no more people in the queue.")
else:
    print(queue[0])  # 取出队头元素,即列表的第一个元素
  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值