2024-1-11,卡码网第20题排队取奶茶
目录
1. 题目描述
假设有一家奶茶店,现在有一些人在排队等待取奶茶,同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。假设每个人取奶茶的时间非常短,可以忽略不计,只需要考虑队列中的操作。 在一系列操作之后,你需要回答:下一个取奶茶的人是谁
队列操作说明:
- 当操作为 1 时,表示有人已经取走奶茶,从队列中删除该人的信息。
- 当操作为 2 时,表示有新人加入排队,将该人的信息加入队列。
2. 代码实现
与上一题不同,这题排队取奶茶的思路更像使用队列,先拿到奶茶的人就退出排队,后来的人在队尾等待。队列的先进先出的规则和排队去奶茶的思路如出一辙。这道题中,也使用列表来模拟队列,使用 append() 函数实现接入队尾(也就是操作2)的操作,使用 pop(0) 实现队头元素先出(也就是操作1)的操作。
2.1 队列
队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO)的原则管理元素。这意味着最先被插入队列的元素将最先被移除,如下图所示。队列常常被用于需要按照顺序处理元素的场景,例如运行程序,后台窗口等等。
队列有两个基本操作:
- 入队(Enqueue): 将元素添加到队列的末尾。
- 出队(Dequeue): 从队列的头部移除元素。
另外,队列还有两个基本属性:
- 前端(Front): 队列的头部,即出队操作发生的位置。
- 后端(Rear): 队列的尾部,即入队操作发生的位置。
from queue import Queue
import threading
# 创建一个队列
my_queue = Queue()
# 定义一个生产者函数
def producer():
for i in range(5):
item = f"Item {i}"
my_queue.put(item)
print(f"Produced: {item}")
# 定义一个消费者函数
def consumer():
while True:
item = my_queue.get()
if item is None:
break
print(f"Consumed: {item}")
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 等待生产者线程完成
producer_thread.join()
# 停止消费者线程
my_queue.put(None)
consumer_thread.join()
2.2 具体代码
这边给出具体代码,如下图所示,解题思路上面已经说过了。
queue = input().split() # 读取队列数据
m = int(input()) # 读取操作次数
# 循环处理操作
for _ in range(m):
operation = input().split()
opt = int(operation[0])
# 出队操作
if opt == 1:
if queue:
queue.pop(0) #移除队列第一个元素
# 入队操作
if opt == 2:
new_people = operation[1]
queue.append(new_people)
# 判断队列是否为空
if queue:
print(queue[0]) # 读取队列第一个元素
else:
print('There are no more people in the queue.')
3. 总结
这道题相对于上一题使用堆栈而言,介绍一种元素管理有很大不同的新数据结构——队列。队列通常会和堆栈放在一起比较,因为这两种数据结构有着异曲同工的数据管理思路。这两道题应当合在一起做。
本人所用代码编辑器为 VS Code,刷题网站为卡码网