卡码网语言基础课 | 20. 排队取奶茶 | 刷题心得

2024-1-11,卡码网第20题排队取奶茶


目录

1. 题目描述

2. 代码实现

2.1 队列

2.2 具体代码

3. 总结


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,刷题网站为卡码网


卡码网icon-default.png?t=N7T8https://kamacoder.com/

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暴风雨使我安睡2580

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

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

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

打赏作者

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

抵扣说明:

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

余额充值