卡码网语言基础课 | 19. 洗盘子 | 刷题心得

2024-1-9,卡码网第19题洗盘子


目录

1. 题目描述

2. 代码实现

2.1 栈的概念

2.2 具体代码

3. 总结


1. 题目描述

使用栈来模拟在餐厅洗盘子的操作。首先会给你一堆带编号的盘子,这作为原始数据压入栈中,然后提供 m 次的操作。操作分为两种,操作一(代号为数字1):洗盘子,将盘子从栈中取出;操作二(代号为数字2)加入待清洗的盘子,盘子自带编号。输出要求是,在 m 次操作后,判断盘子是否洗完,如果洗完,则输出“All the dishes have been washed.”;如果没洗完,则输出要洗的第一个盘子。

2. 代码实现

洗盘子,非常类似于栈的先进先出的原则——盘子一个一个叠在一起,然后洗的时候先拿最上面的盘子;加入新的待洗盘子则是放在盘子堆顶。操作1就是洗盘子,就是从栈顶取出元素并去除,即 pop;操作2就是加入待洗的盘子,就是将新元素压入栈顶。

2.1 栈的概念

栈(Stack)是一种数据结构,它是一个按照后进先出(LIFO)原则管理元素的集合。这意味着最后添加到栈的元素将首先被移除。

在Python中,可以使用列表(List)来实现栈的基本功能。列表提供了 append()方法用于在列表的末尾添加元素,而 pop()方法则用于移除并返回列表的最后一个元素

下面是一个简单的实例,演示如何使用列表实现栈:

# 创建一个空列表作为栈
stack = []

# 向栈中添加元素
stack.append(1)
stack.append(2)
stack.append(3)

print("栈的状态:", stack)

# 从栈中移除并返回最后一个元素
pop_element = stack.pop()
print("移除的元素:", pop_element)
print("栈的状态:", stack)

2.2 具体代码

我们使用列表来模拟栈,首先读取盘子数据(这里使用 map 函数将字符串转换为整形传入列表)。然后读取需要操作的次数,然后读取操作数字(是1还是2),这时候就需要使用 if-else 条件语句判断是哪一个操作。然后,操作一的取出并去除对应 pop() 函数,括号里不添加索引默认去除最后一位;操作二的压入对应 append() 函数。最后,判断盘子是否为空,然后输出不同的值。

当然,有一点需要注意的是,进行操作一时,需要事先判断栈是否为空。

plates = list(map(int, input().split()))

m = int(input())

for _ in range(m):
    operation = list(map(int, input().split()))
    opt = int(operation[0])
    
    # if plates:
    if opt == 1:
        if plates: # 盘子堆是否为空
            washed_plate = plates.pop()
        
    elif opt == 2:
        add_plate = operation[1]
        plates.append(add_plate)
        
if plates:
    print(plates[-1])
else:
    print('All the dishes have been washed.')

3. 总结

这道题很形象的为我们展示了栈的工作原理和特点。盘子堆就是栈,盘子就是里面的元素。栈,在实际应用中也很多,关于栈的算法题也有很多。这一篇介绍的栈和下一篇介绍的队列是两种大致相同却又有所不同的数据类型。


本人所用代码编辑器为 VS Code,刷题网站为卡码网


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暴风雨使我安睡2580

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

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

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

打赏作者

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

抵扣说明:

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

余额充值