当前位置: 首页 > article >正文

Python[数据结构及算法 --- 栈]

一.栈的概念

在 Python 中,栈(Stack)是一种 “  后进先出(LIFO)”的数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。

二.栈的抽象数据类型 

1.抽象数据类型 “栈” 定义:

<1>.Stack ():创建一个空栈,不包含任何数据项
<2>.push (item):将 item 加入栈顶,无返回值
<3>.pop ():将栈顶数据项移除,并返回,栈被修改
<4>.peek ():“窥视” 栈顶数据项,返回栈顶的数据项但不移除,栈不被修改
<5>.isEmpty ():返回栈是否为空栈
<6>.size ():返回栈中有多少个数据项 

2.简单操作样例:

Stack OperationStack ContentsReturn Value
s = Stack()[]Stack object
s.isEmpty()[]True
s.push(4)[4]
s.push('dog')[4, 'dog']
s.peek()[4, 'dog']'dog'
s.push(True)[4, 'dog', True]
s.size()[4, 'dog', True]3
s.isEmpty()[4, 'dog', True]False
s.push(8.4)[4, 'dog', True, 8.4]
s.pop()[4, 'dog', True]8.4
s.pop()[4, 'dog']True
s.size()[4, 'dog']2

3.操作实例代码实现:

class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items) - 1]def size(self):return len(self.items)# 操作样例
s = Stack()
print("s.isEmpty():", s.isEmpty())  # Trues.push(4)
s.push('dog')
print("s.peek():", s.peek())  # 'dog's.push(True)
print("s.size():", s.size())  # 3
print("s.isEmpty():", s.isEmpty())  # Falses.push(8.4)
print("s.pop():", s.pop())  # 8.4
print("s.pop():", s.pop())  # True
print("s.size():", s.size())  # 2    

三.栈的应用

1.简单括号匹配:

class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items) - 1]def size(self):return len(self.items)def parChecker(symbolString):s = Stack()balanced = Trueindex = 0while index < len(symbolString) and balanced:symbol = symbolString[index]if symbol == "(":s.push(symbol)else:if s.isEmpty():balanced = Falseelse:s.pop()index = index + 1if balanced and s.isEmpty():return Trueelse:return False# 测试示例
print(parChecker("((()))"))      # True
print(parChecker("(()"))        # Error: unmatched left parentheses
print(parChecker("(]"))         # Error at position 1: mismatched ']'
print(parChecker("{[()]}"))     # True
print(parChecker("{[(])}"))     # Error at position 3: mismatched ')'

代码分析:

1.提供的代码是一个使用栈(Stack)检查括号平衡性的函数 parChecker。这个函数可以判断一个字符串中的括号是否匹配(即每个左括号 ( 都有对应的右括号 ))。

2.实现过程:

<1>.初始化栈:创建一个空栈 s 用于存储左括号 (。

<2>.遍历字符串:从左到右扫描每个字符:

       遇到左括号 ( 时,将其压入栈。

       遇到右括号 ) 时:

如果栈为空,说明没有匹配的左括号,返回 False。

如果栈不为空,弹出栈顶元素(即匹配一个左括号)。

<3>.最终判断:遍历结束后,如果栈为空且所有括号都匹配,则返回 True,否则返回 False。

3.复杂度分析:

<1>.时间复杂度:O (n),其中 n 是字符串长度。

<2>.空间复杂度:O (n),最坏情况下栈存储所有左括号(如 "(((((")。

2.将十进制数转换成二进制数:

def divideBy2(decnumber):remstack = Stack()while decnumber > 0:rem = decnumber % 2remstack.push(rem)decnumber = decnumber // 2binstring = ""while not remstack.isEmpty():binstring = binstring + str(remstack.pop())return binstringprint(divideBy2(100))
print(divideBy2(200))
print(divideBy2(300))
print(divideBy2(400))
print(divideBy2(500))

代码分析:

1.提供的代码是一个使用栈(Stack)将十进制数转换为二进制数的函数 divideBy2。这个函数通过不断除以 2 并记录余数,最后反向拼接余数得到二进制表示。

2.实现过程:

<1>.初始化栈:创建一个空栈 remstack 用于存储每次除法的余数。

<2>.循环取余:当十进制数 decnumber 大于 0 时,不断进行以下操作:

                         1.计算 decnumber % 2 得到余数(0 或 1)。

                         2.将余数压入栈 remstack。

                         3.更新 decnumber 为其整数除法结果(decnumber // 2)。

<3>.拼接二进制字符串:从栈中弹出所有元素并拼接成字符串,得到二进制表示。

3.复杂度分析:

<1>.时间复杂度:O(log n)

每次循环将输入数减半,循环次数为 log₂(n),每次操作(取余、压栈)时间为 O (1)。

<2>.空间复杂度:O(log n)

栈中存储的余数数量为 log₂(n),拼接字符串的空间也为 log₂(n)。

优化改进:

将上述代码改进成可以任意进制转换,适配性更强:

class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items) - 1]def size(self):return len(self.items)def baseConverter(decnumber,base):digits = "0123456789ABCDEF"remstack = Stack()while decnumber > 0:rem = decnumber % baseremstack.push(rem)decnumber = decnumber // basenewstring = ""while not remstack.isEmpty():newstring = newstring + digits[remstack.pop()]return newstringprint(baseConverter(100,2))
print(baseConverter(100,4))
print(baseConverter(100,6))
print(baseConverter(100,8))
print(baseConverter(100,10))
print(baseConverter(100,16))

以上就是一些比较经典的栈的应用。

相关文章:

Python[数据结构及算法 --- 栈]

一.栈的概念 在 Python 中&#xff0c;栈&#xff08;Stack&#xff09;是一种 “ 后进先出&#xff08;LIFO&#xff09;”的数据结构&#xff0c;仅允许在栈顶进行插入&#xff08;push&#xff09;和删除&#xff08;pop&#xff09;操作。 二.栈的抽象数据类型 1.抽象数…...

Unity VR/MR开发-开发环境准备

视频讲解链接&#xff1a; 【XR马斯维】UnityVR/MR开发环境准备【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

2025-06-08-深度学习网络介绍(语义分割,实例分割,目标检测)

深度学习网络介绍(语义分割,实例分割,目标检测) 前言 在开始这篇文章之前&#xff0c;我们得首先弄明白&#xff0c;什么是图像分割&#xff1f; 我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程&#xff0c;即像素级别的…...

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO…...

【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级

概述 在历经半个月的间歇性开发后&#xff0c;RagflowPlus再次迎来一轮升级&#xff0c;正式发布v0.4.0。 开源地址&#xff1a;https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码&#xff1a; git clone https://github.com/zstar1003/ragflow-plus.…...

智能照明系统:具备认知能力的“光神经网络”

智能照明系统是物联网技术与传统照明深度融合的产物&#xff0c;其本质是通过感知环境、解析需求、自主决策的闭环控制&#xff0c;重构光与人、空间、环境的关系。这一系统由智能光源、多维传感器、边缘计算单元及云端管理平台构成&#xff0c;形成具备认知能力的“光神经网络…...

ubuntu系统 | docker+dify+ollama+deepseek搭建本地应用

1、docker 介绍与安装 docker安装:1、Ubuntu系统安装docker_ubuntu docker run-CSDN博客 docker介绍及镜像源配置:2、ubuntu系统docker介绍及镜像源和仓库配置-CSDN博客 docker常用命令:3、ubuntu系统docker常用命令-CSDN博客 docker compose安装:4、docker compose-CS…...

Docker 镜像上传到 AWS ECR:从构建到推送的全流程

一、在 EC2 实例中安装 Docker&#xff08;适用于 Amazon Linux 2&#xff09; 步骤 1&#xff1a;连接到 EC2 实例 ssh -i your-key.pem ec2-useryour-ec2-public-ip步骤 2&#xff1a;安装 Docker sudo yum update -y sudo amazon-linux-extras enable docker sudo yum in…...

SpringSecurity+vue通用权限系统

SpringSecurityvue通用权限系统 采用主流的技术栈实现&#xff0c;Mysql数据库&#xff0c;SpringBoot2Mybatis Plus后端&#xff0c;redis缓存&#xff0c;安全框架 SpringSecurity &#xff0c;Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...

如何在Spring Boot中使用注解动态切换实现

还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...

短视频时长预估算法调研

weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp​(1−p)oddsTp(Tpodds…...

基于Java的离散数学题库系统设计与实现:附完整源码与论文

JAVASQL离散数学题库管理系统 一、系统概述 本系统采用Java Swing开发桌面应用&#xff0c;结合SQL Server数据库实现离散数学题库的高效管理。系统支持题型分类&#xff08;选择题、填空题、判断题等&#xff09;、难度分级、知识点关联&#xff0c;并提供智能组卷、在线测试…...

板凳-------Mysql cookbook学习 (十--2)

5.12 模式匹配中的大小写问题 mysql> use cookbook Database changed mysql> select a like A, a regexp A; ------------------------------ | a like A | a regexp A | ------------------------------ | 1 | 1 | --------------------------…...

设计模式域——软件设计模式全集

摘要 软件设计模式是软件工程领域中经过验证的、可复用的解决方案&#xff0c;旨在解决常见的软件设计问题。它们是软件开发经验的总结&#xff0c;能够帮助开发人员在设计阶段快速找到合适的解决方案&#xff0c;提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三…...

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景

一、什么是FTPS&#xff1f; FTPS&#xff0c;英文全称File Transfer Protocol with support for Transport Layer Security (SSL/TLS)&#xff0c;安全文件传输协议&#xff0c;是一种对常用的文件传输协议(FTP)添加传输层安全(TLS)和安全套接层(SSL)加密协议支持的扩展协议。…...

RK3568项目(七)--uboot系统之外设与PMIC详解

目录 一、引言 二、按键 ------>2.1、按键种类 ------------>2.1.1、RESET ------------>2.1.2、UPDATE ------------>2.1.3、PWRON 部分 ------------>2.1.4、RK809 PMIC ------------>2.1.5、ADC按键 ------------>2.1.6、ADC按键驱动 ------…...

Three.js进阶之粒子系统(一)

一些特定模糊现象&#xff0c;经常使用粒子系统模拟&#xff0c;如火焰、爆炸等。Three.js提供了多种粒子系统&#xff0c;下面介绍粒子系统 一、Sprite粒子系统 使用场景&#xff1a;下雨、下雪、烟花 ce使用代码&#xff1a; var materialnew THRESS.SpriteMaterial();//…...

【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档

仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头&#xff08;视觉输入&#xff09; 麦克风阵列&#xff08;听觉输入&#xff09; 颈部发声装置&#xff08;语音输出&#xff09…...

小白的进阶之路系列之十四----人工智能从初步到精通pytorch综合运用的讲解第七部分

通过示例学习PyTorch 本教程通过独立的示例介绍PyTorch的基本概念。 PyTorch的核心提供了两个主要特性: 一个n维张量,类似于numpy,但可以在gpu上运行 用于构建和训练神经网络的自动微分 我们将使用一个三阶多项式来拟合问题 y = s i n ( x ) y=sin(x) y=sin(x),作为我们的…...

JavaScript性能优化实战大纲

性能优化的核心目标 降低页面加载时间&#xff0c;减少内存占用&#xff0c;提高代码执行效率&#xff0c;确保流畅的用户体验。 代码层面的优化 减少全局变量使用&#xff0c;避免内存泄漏 // 不好的实践 var globalVar I am global;// 好的实践 (function() {var localV…...

Python 解释器安装全攻略(适用于 Linux / Windows / macOS)

目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…...

Java多线程从入门到精通

一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 线程是CPU调度的基本单位&#xff0c;每个线程执行的都是某一个进程的代码的某…...

【芯片仿真中的X值:隐藏的陷阱与应对之道】

在芯片设计的世界里&#xff0c;X值&#xff08;不定态&#xff09;就像一个潜伏的幽灵。它可能让仿真测试顺利通过&#xff0c;却在芯片流片后引发灾难性后果。本文将揭开X值的本质&#xff0c;探讨其危害&#xff0c;并分享高效调试与预防的实战经验。    一、X值的本质与致…...

C++ 变量和基本类型

1、变量的声明和定义 1.1、变量声明规定了变量的类型和名字。定义初次之外&#xff0c;还申请存储空间&#xff0c;也可能会为变量赋一个初始值。 如果想声明一个变量而非定义它&#xff0c;就在变量名前添加关键字extern&#xff0c;而且不要显式地初始化变量&#xff1a; e…...

LeetCode第244题_最短单词距离II

LeetCode第244题&#xff1a;最短单词距离II 问题描述 设计一个类&#xff0c;接收一个单词数组 wordsDict&#xff0c;并实现一个方法&#xff0c;该方法能够计算两个不同单词在该数组中出现位置的最短距离。 你需要实现一个 WordDistance 类: WordDistance(String[] word…...

Linux 中替换文件中的某个字符串

如果你想在 Linux 中替换文件中的某个字符串&#xff0c;可以使用以下命令&#xff1a; 1. 基本替换&#xff08;sed 命令&#xff09; sed -i s/原字符串/新字符串/g 文件名示例&#xff1a;将 file.txt 中所有的 old_text 替换成 new_text sed -i s/old_text/new_text/g fi…...

python3GUI--基于PyQt5+DeepSort+YOLOv8智能人员入侵检测系统(详细图文介绍)

文章目录 一&#xff0e;前言二&#xff0e;技术介绍1.PyQt52.DeepSort3.卡尔曼滤波4.YOLOv85.SQLite36.多线程7.入侵人员检测8.ROI区域 三&#xff0e;核心功能1.登录注册1.登录2.注册 2.主界面1.主界面简介2.数据输入3.参数配置4.告警配置5.操作控制台6.核心内容显示区域7.检…...

5. TypeScript 类型缩小

在 TypeScript 中&#xff0c;类型缩小&#xff08;Narrowing&#xff09;是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码&#xff0c;确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…...

Python_day48随机函数与广播机制

在继续讲解模块消融前&#xff0c;先补充几个之前没提的基础概念 尤其需要搞懂张量的维度、以及计算后的维度&#xff0c;这对于你未来理解复杂的网络至关重要 一、 随机张量的生成 在深度学习中经常需要随机生成一些张量&#xff0c;比如权重的初始化&#xff0c;或者计算输入…...

【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)

目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题&#xff0c;描述如下&#xff1a; 我在qtdesigner用界面拖了一个QTableView控件&#xff0c;object name为【tableView_electrode】&#xff0c;然后【提升为】了自定义的类【Steer_Electrode_Table】&…...