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

news2024/9/20 18:46:47

目录

  • 题目描述与分析
  • 一、栈
  • 二、栈的操作
  • 三、代码编写


题目描述与分析

题目描述:
在餐厅里,洗盘子的工作需要使用到栈这种数据结构。
假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程,每个盘子都有一个编号。
盘子堆放区操作说明:
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])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同一台电脑上安装不同版本的nodejs(搭配VSCode)

今天拉取了一个前后端分离的项目,运行前端的时候,出现node版本不匹配的情况。 本文章将从安装node.js开始到VSCode使用进行讲解 1、去官网下载node版本 以16版本为例,需要哪个版本,就在网址上把版本号替换即可 https://nodejs.o…

在ADS中使用传输端口参数构建理想元器件模型---以3dB电桥为例

在ADS中使用传输端口参数(S、Z、Y、ABCD)构建理想元器件模型—以3dB电桥为例 本文工程文件下载:在ADS中使用传输端口参数构建理想元器件模型-以3dB电桥为例-工程文件 目录 在ADS中使用传输端口参数(S、Z、Y、ABCD)构建…

8月18日笔记

目标不出网场景 在目标环境完全不出网的情况下,即所有的网络通信如SMB(Server Message Block)、DNS(Domain Name System)甚至包括TCP(Transmission Control Protocol)都不允许与外部网络进行交…

使用极限网关实现 ES 跨集群搜索

使用 ES 的小伙伴,有没有在用跨集群搜索的? 熟悉 ES 的小伙伴都知道,ES 本身就能实现跨集群搜索,那为啥还要聊这个?试想一下,如果集群都上线投产了,才出现跨集群搜索需求,那么可能出…

重磅!RISC-V+OpenHarmony平板电脑发布

仟江水商业电讯(8月18日 北京 委托发布)RISC-V作为历史上全球发展速度最快、创新最为活跃的开放指令架构,正在不断拓展高性能计算领域的边界。OpenHarmony是由开放原子开源基金会孵化并运营的开源项目,已成为发展速度最快的智能终…

Chapter 40 Socket网络编程

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、Socket网络编程二、Socket服务端编程三、Socket客户端编程四、服务端与客户端相互通讯 前言 在现代计算机网络中,Socket(套接字&#xff09…

【题解】—— LeetCode一周小结33

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结32 12.实现一个魔法字典 题目链接:676. 实现一个魔…

Kettle根据时间戳同步数据实现

1 Kettle总体步骤 更多数据实时同步方案,请参考笔者的另一篇博文:大数据时代,数据实时同步解决方案的思考—最全的数据同步总结 由于Kettle自身的特殊性以及在多个步骤中kettle自身处理数据库事务的特殊性,尝试了很多种方案&…

win11内存占用高的解决办法

win11莫名奇妙的总是内存爆满,真的抽象,16g根本不够用。尝试各种方法看看能不能解决… 方法一 关闭快速启动 win11系统,自带快速开机功能,可能用较大内存,关闭看看。控制面板找到电源设置关闭快速启动。 如果没找到要…

C++ | Leetcode C++题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution { public:string reverseVowels(string s) {auto isVowel [vowels "aeiouAEIOU"s](char ch) {return vowels.find(ch) ! string::npos;};int n s.size();int i 0, j n - 1;while (i < j) {while (i < …

Leetcode JAVA刷刷站(48)旋转图像

一、题目概述 二、思路方向 要在原地顺时针旋转一个 n x n 的二维矩阵 90 度&#xff0c;你可以通过一系列交换操作来实现。这里的关键在于理解旋转后的矩阵与原矩阵之间的元素对应关系。 假设原矩阵为 matrix&#xff0c;其中 matrix[i][j] 表示第 i 行第 j 列的元素。旋转 90…

【每日一题 | 数据结构】压缩矩阵存储算法

题型方法讲解 首先明确&#xff0c;压缩矩阵存储算法是408考试中的重点、难点、高频考点&#xff0c;甚至曾经达成了连续五年考到程度&#xff0c;让同学们感到恐惧。很多同学都会把这类题型当成一个记公式的题&#xff0c;其实不然&#xff0c;这个视频将会告诉你如何用推导的…

485总线常开+常闭,8路C型继电器输出模块DAM-3018CA

阿尔泰科技 型号&#xff1a;DAM-3018CA 概述&#xff1a; DAM-3018CA为8路C型继电器输出模块&#xff0c;每通道具有LED指示灯指示&#xff0c;RS485通讯接口&#xff0c;带有标准ModbusRTU协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 产品图…

Leetcode JAVA刷刷站(50)Pow(x, n)

一、题目概述 二、思路方向 方法1&#xff1a;递归&#xff08;考虑正负n&#xff09; 这种方法利用递归的思想&#xff0c;将问题分解为更小的子问题。同时&#xff0c;考虑到n可能是负数&#xff0c;我们可以先处理n的符号&#xff0c;然后将问题转化为正数幂的问题。 publi…

24/8/15算法笔记 复习_决策树

#手动计算决策树到底是如何实现分类的 p1 (y N).mean() p2 (y Y).mean()p1 * np.log2(1/p1) p2*np.log2(1/p2)X[真实用户] y x X[日志密度].unique()#.unique() 是一个方法&#xff0c;它返回一个数组&#xff0c;包含 X[日志密度] 列中所有不同的值。 x.sort()#排序 print…

读零信任网络:在不可信网络中构建安全系统21读后总结与感想兼导读

1. 基本信息 零信任网络&#xff1a;在不可信网络中构建安全系统 道格巴斯&#xff08;Doug Barth&#xff09; 著 人民邮电出版社,2019年8月出版 1.1. 读薄率 书籍总字数252千字&#xff0c;笔记总字数73194字。 读薄率73194252000≈29.5% 这个读薄率是最高的吧&#x…

客户端登录逻辑

将网关服务器发送的数据通过信号传递给 TcpMgr 中定义的槽函数 void LoginDialog::initHttpHandlers() {// 注册获取登录回包逻辑m_handlers.insert(ReqId::ID_LOGIN_USER, [this](QJsonObject jsonObj){int error jsonObj["error"].toInt();if(error ! ErrorCodes:…

Superset BI封装自定义组件(堆叠柱状图)

目录 前言 封装步骤 一、创建组件文件夹 二、预设组件信息 三、使用组件 往期回顾 前言 Superset 是一个现代化的、易于使用的、轻量级的数据可视化工具&#xff0c;它允许用户通过简单的点击操作来创建和分享图表。如果你想在 Superset 中创建自定义组件&#xff0c;你…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…

mac/win视频编辑软件Premiere Pro Pr安装装下载

目录 一、PR软件介绍 1.1 PR软件概览 1.2 独特优势 1.3 应用场景 二、安装与硬件要求 2.0下载 2.1 安装步骤 2.2 硬件要求 三、使用方法 3.1 基础操作 3.2 编辑技巧 3.3 高级功能 一、PR软件介绍 1.1 PR软件概览 Adobe Premiere Pro&#xff08;简称PR&#xff0…