卡码网语言基础课(Python) | 19.洗盘子

卡码网语言基础课(Python) | 19.洗盘子

一、题目描述

在餐厅里,洗盘子的工作需要使用到栈这种数据结构。

假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程,每个盘子都有一个编号。

盘子堆放区操作说明:1)当操作为1时,表示从盘子堆放区拿走顶部的盘子清洗;2)当操作为2时,表示有未洗的盘子放入盘子堆放区。在一系列操作之后,你需要回答:下一个清洗的盘子编号?

  • 输入描述: 第一行有一个整数n,代表初始盘子堆放区中盘子的数量为n。第二行有n个整数,代表了盘子的编号,同时整数之间的顺序也代表了未洗盘子加入盘子堆放区的顺序。第三行为一个整数m,代表接下来将会有m次操作。接下来一共有m行,代表共有m次操作。如果是操作1,那么该行只会有一个数字1,代表有一个盘子被拿走清洗。如果是操作2,那么该行有两个数字,第一个数字2表示有未洗的盘子加入,第二个数字代表未洗的盘子编号。
  • 输出描述: 输出共一行,为下一个该清洗的盘子编号。如果没有下一个该清洗的盘子,那么请输出"All the dishes have been washed."

二、栈

栈的操作实际上和洗盘子的过程是类似的,洗盘子的过程中,会拿出待清洗那一摞盘子的最顶端的哪个盘子,清洗之后将其放在已清洗区域,这对于待清洗盘子来说是出栈,对于已清洗区域来说,是入栈(进栈),具体的过程可以看下面的图示:

栈这种结构只能在一侧(栈顶那一侧)进行插入和删除操作,而且是后进先出LIFO (后进入栈的元素离栈顶比较近,先出来),允许进行插入和删除的那一端是栈顶,与之对应的另一端是栈底,如果一个栈不包含任何元素,这个栈被称为空栈。

三、栈的操作

Python语言确实支持栈数据结构,但它通常是通过列表来模拟实现的。

栈的常用操作主要有以下几种:

  • 获取栈的长度,即栈中元素的数量,这通过len()获取列表的长度来实现;
  • 进栈操作,将新的元素放入栈中,新的元素成为栈顶元素,栈顶元素即最后一个元素,这通过append()操作将新的元素添加到列表中就可以实现;
  • 出栈操作,栈顶元素(列表的最后一个元素)从栈中离开,可以通过pop()移除列表的最后一个元素;
  • 获取栈顶元素:获取列表的最后一位元素即可,可以通过索引list[-1]获取;
  • 判断栈是否为空:可以通过if not stack来判定。

列表(以及其他一些容器,比如字符串、元组)在空的情况下会被视为False,而在非空的情况下会被视为True。因此,如果一个列表为空,not stack将会返回True,表示列表为空;如果列表非空,not stack将会返回False,表示列表不为空。

python 复制代码
stack = []   # 创建一个空栈
# 入栈
stack.append(1)
stack.append(2)
stack.append(3)
# 出栈
top_element = stack.pop()  # 弹出并返回栈顶元素
print(top_element)  # 输出3
# 判断栈是否为空
if not stack:

四、代码编写

第一行要接收整数n的输入,表示栈中有n个盘子,之后读取一行数据,表示盘子编号,将字符串拆分后,转为整数,最后转为列表方便遍历。

python 复制代码
# 读取初始盘子数量
n = int(input())
# 读取盘子的编号列表
plates = list(map(int, input().split()))

接下来接收m和m个整数的输入,表示对盘子的操作,如果数字为1,表示盘子被拿去清洗,即出栈操作,如果数字为2,表示有新的盘子加入到待清洗区域中,即入栈操作。

python 复制代码
# 读取操作次数
m = int(input())
# 循环处理每次操作
for _ in range(m):
	# 获取对盘子的操作,可能有1位数字或者两位数字,将之拆分为列表
	operation = input().split()
	# 第一位数字表示对盘子的操作
	opt = int(operation[0])
	# 如果数字为1,表示盘子被拿去清洗
	if opt == 1:
		# 出栈操作
	# 如果数字为2,表示盘子被拿去清洗
	elif opt == 2:
		# 入栈操作

但是在这里需要注意的一点是,如果栈已经成为空栈,再输入1,也无法弹出栈顶元素,所以执行出栈操作前需要判断栈是否为空。

出栈从列表中移除最后一个元素即可,而入栈通过append来模拟实现

python 复制代码
# 操作1:拿走并清洗盘子
if opt == 1:
	if plates:
		# 通过pop()操作移除最后一个盘子
		cleaned_plate = plates.pop()
# 操作2:将未洗的盘子放入盘子堆放区
elif opt == 2:
	# 将盘子编号转为int类型
	plate_number = int(operation[1])
	# 通过append()操作向栈中添加盘子
	plates.append(plate_number)

当执行完所有操作后,如果没有下一个该清洗的盘子,输出"All the dishes have been washed.",如果有,则输出下一个待清洗的盘子编号。

python 复制代码
# 判断盘子堆放区是否为空
if not plates:
	print("All the dishes have been washed.")
else:
	# 获取栈顶元素,即切片的最后一个元素
	print(plates[-1])

完整的代码如下:

python 复制代码
# 读取初始盘子数量
n = int(input())

# 读取盘子的编号列表
plates = list(map(int, input().split()))

# 读取操作次数
m = int(input())
# 循环处理每次操作
for _ in range(m):
    operation = input().split()
    opt = int(operation[0])
    if opt == 1:
        if plates:
            cleaned_plate = plates.pop()
    elif opt == 2:
        plate_number = int(operation[1])
        plates.append(plate_number)

if not plates:
    print("All the dishes have been washed.")
else:
    print(plates[-1])
相关推荐
浅念-1 天前
C++第一课
开发语言·c++·经验分享·笔记·学习·算法
q_35488851531 天前
机器学习:python共享单车数据分析系统 可视化 Flask框架 单车数据 骑行数据 大数据 机器学习 计算机毕业设计✅
人工智能·python·机器学习·数据分析·flask·推荐算法·共享单车
charlie1145141911 天前
现代嵌入式C++教程:对象池(Object Pool)模式
开发语言·c++·学习·算法·嵌入式·现代c++·工程实践
小北方城市网1 天前
接口性能优化实战:从秒级到毫秒级
java·spring boot·redis·后端·python·性能优化
人工智能AI技术1 天前
【Agent从入门到实践】22 LLM的局限性:Agent开发中需要规避的坑
人工智能·python
小北方城市网1 天前
Redis 缓存设计与避坑实战:解决穿透 / 击穿 / 雪崩
java·大数据·数据库·redis·python·elasticsearch·缓存
喵手1 天前
Python爬虫零基础入门【第一章:开篇与准备·第2节】环境搭建:Python/虚拟环境/依赖/抓包工具一次搞定!
爬虫·python·抓包工具·python爬虫实战·环境准备·python环境配置·python爬虫工程化实战
小二·1 天前
Python Web 开发进阶实战:神经符号系统 —— 在 Flask + Vue 中融合深度学习与知识图谱
前端·python·flask
Goona_1 天前
PyQt+Excel学生信息管理系统,增删改查全开源
python·小程序·自动化·excel·交互·pyqt
叫我辉哥e11 天前
新手进阶Python:办公看板集成OA自动化+AI提醒+定时任务
人工智能·python·自动化