【卡码网Python基础课 19.洗盘子】


题目描述与分析

题目描述:
在餐厅里,洗盘子的工作需要使用到栈这种数据结构。
假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程,每个盘子都有一个编号。
盘子堆放区操作说明:
1.当操作为 1 时,表示从盘子堆放区拿走顶部的盘子清洗。
2.当操作为 2 时,表示有未洗的盘子放入盘子堆放区。
在一系列操作之后,你需要回答:下一个清洗的盘子编号?

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

输出描述:
输出共一行,为下一个该清洗的盘子编号。 如果没有下一个该清洗的盘子,那么请输出 “All the dishes have been washed.”

输入示例:

5
1001 1002 1003 1004 1005
3
1
1
2 1006

输出示例

1006

一、栈

栈是一种非常基本的数据结构,它遵循后进先出(Last In First Out, LIFO)的原则。这意味着在栈中,最后一个添加的元素将是第一个被移除的元素。
栈的操作实际上和洗盘子的过程是类似的,洗盘子的过程中,会拿出待清洗那一摞盘子的最顶端的那个盘子,清洗之后将其放在已清洗区域,这对于待清洗盘子来说是出栈,对于已清洗区域来说,是入栈(进栈),具体的过程可以看下面的图示:
在这里插入图片描述
栈这种结构只能在一侧(栈顶那一侧)进行插入和删除操作,而且是后进先出 LIFO(后进入栈的元素离栈顶比较近,先出来),允许进行插入和删除的那一端是栈顶,与之对应的另一端是栈底,如果一个栈不包含任何元素,这个栈被称为空栈。

二、栈的操作

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

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

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

stack = []  # 创建一个空栈

# 入栈
stack.append(1)
stack.append(2)
stack.append(3)

# 出栈
top_element = stack.pop()  # 弹出并返回栈顶元素
print(top_element)  # 输出 3

# 判断栈是否为空
if not stack:

三、代码编写

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

# 读取初始盘子数量
n = int(input())

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

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

# 读取操作次数
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来模拟实现

# 操作 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.”,如果有,则输出下一个待清洗的盘子编号。

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

完整代码如下:

# 读取初始盘子数量
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:
        # 操作 1: 拿走并清洗盘子
        if plates:
            cleaned_plate = plates.pop()
    elif opt == 2:
        # 操作 2: 将未洗的盘子放入盘子堆放区
        plate_number = int(operation[1])
        plates.append(plate_number)

# 判断盘子堆放区是否为空
if not plates:
    print("All the dishes have been washed.")
else:
    print(plates[-1])
  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值