首页 > 编程语言 >python中的栈

python中的栈

时间:2025-01-05 21:44:18浏览次数:1  
标签:deque python top pop token stack append

在 Python 中,栈是一种数据结构,常用于需要遵循 后进先出(LIFO) 原则的操作。在刷算法题时,栈常用来解决括号匹配、单调栈、深度优先搜索等问题。

以下是 Python 中栈的相关语法和常用操作。

栈的实现方式

Python 中可以使用以下两种方式实现栈:

  1. 使用列表 (list)。
  2. 使用 collections.deque(双端队列)。

使用列表实现栈

stack = []

# 压入元素
stack.append(1)
stack.append(2)
stack.append(3)

# 弹出元素
top = stack.pop()  # 返回 3,栈变为 [1, 2]

# 查看栈顶元素(不移除)
top = stack[-1]  # 返回 2

# 检查栈是否为空
is_empty = len(stack) == 0

使用 collections.deque

deque 的性能比列表更优,因为它对两端的操作时间复杂度为 O(1),而列表的插入/删除操作可能会导致 O(n) 的开销。

from collections import deque

stack = deque()

# 压入元素
stack.append(1)
stack.append(2)
stack.append(3)

# 弹出元素
top = stack.pop()  # 返回 3

# 查看栈顶元素
top = stack[-1]  # 返回 2

# 检查栈是否为空
is_empty = len(stack) == 0

栈的常见应用

1. 括号匹配问题

def isValid(s):
    stack = []
    mapping = {')': '(', '}': '{', ']': '['}
    
    for char in s:
        if char in mapping:  # 是右括号
            top_element = stack.pop() if stack else '#'  # 获取栈顶元素
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)  # 是左括号,压入栈中
    return not stack

# 示例
print(isValid("()[]{}"))  # True
print(isValid("(]"))      # False

2. 单调栈(求解下一个更大元素)

def nextGreaterElements(nums):
    stack = []
    res = [-1] * len(nums)
    
    for i in range(len(nums)):
        while stack and nums[i] > nums[stack[-1]]:
            index = stack.pop()
            res[index] = nums[i]
        stack.append(i)
    
    return res

# 示例
print(nextGreaterElements([2, 1, 2, 4, 3]))  # [4, 2, 4, -1, -1]

3. 深度优先搜索(DFS)

def dfs(graph, start):
    stack = [start]
    visited = set()
    
    while stack:
        node = stack.pop()
        if node not in visited:
            visited.add(node)
            # 将邻接节点压入栈
            stack.extend(graph[node])
    
    return visited

# 示例图
graph = {
    1: [2, 3],
    2: [4],
    3: [],
    4: []
}
print(dfs(graph, 1))  # {1, 2, 3, 4}

4. 计算逆波兰表达式

def evalRPN(tokens):
    stack = []
    
    for token in tokens:
        if token not in "+-*/":
            stack.append(int(token))
        else:
            b = stack.pop()
            a = stack.pop()
            if token == '+':
                stack.append(a + b)
            elif token == '-':
                stack.append(a - b)
            elif token == '*':
                stack.append(a * b)
            elif token == '/':
                stack.append(int(a / b))  # 符合题目要求的整除
            
    return stack[0]

# 示例
tokens = ["2", "1", "+", "3", "*"]
print(evalRPN(tokens))  # 9

总结

  • 常用方法append(压入栈),pop(弹出栈顶),[-1](查看栈顶)。
  • 应用场景:括号匹配、单调栈、DFS、逆波兰表达式计算、直方图最大矩形面积等。
  • 性能选择:对于频繁插入和删除操作,建议使用 collections.deque,性能优于 list

在刷题时,熟练使用栈的基本操作和思想,将显著提升解题效率。

标签:deque,python,top,pop,token,stack,append
From: https://www.cnblogs.com/lmc7/p/18653956

相关文章

  • 年会抽奖系统Python源码分享
    源码和打包后的EXE文件放在网盘了,可直接下载使用1.使用方法:  -在participants.txt中输入参与者名单(每行一个名字)  -双击运行"年会抽奖系统.exe"  -按照程序提示进行操作2.注意事项:  -participants.txt必须和程序在同一目录下  -参与者名单请......
  • 【python编程】避免 Python 中的反模式编程
    Python受欢迎的原因之一是其灵活性,这对开发人员有很多好处。然而,它也包含一些陷阱和坏习惯,这些陷阱和坏习惯会导致代码难以阅读、维护或调试。在本文中,我们将介绍一些常见的Python反模式以及如何避免它们。建议新手程序员避免不好的编码习惯,并且不断练习良好的编码风格,会为以后......
  • [python3]Excel解析库-calamine,10倍openpyxl性能
    `calamine`是一个用于读取多种电子表格格式(如Excel、LibreOfficeCalc等)的Python库。它支持`.xls`,`.xlsx`,`.ods`和`.csv`文件格式,提供了简单易用的API来加载和处理电子表格数据。`calamine`的一大特点是它的轻量级和高效性,特别适合需要快速解析电子表格而不依......
  • Python绘制土地利用和土地覆盖类型图详解
    土地利用和土地覆盖是环境科学和城市规划中的重要概念,它们能够帮助本文理解人与自然的关系,促进可持续发展。随着城市化进程的加快,科学地监测和管理土地资源显得尤为重要。Python作为一种强大的编程语言,凭借其丰富的数据分析库,广泛应用于这项工作中。本文将详细介绍如何使用Python......
  • Udemy——Python数据结构与算法(11)
     课程:【Udemy高分付费课程】Python数据结构与算法-终极Python编码面试和计算机科学训练营(中英文字幕)_哔哩哔哩_bilibili算法归并排序基本思想归并排序是一种基于分治思想的排序算法。它的核心思想是将待排序序列不断分成两半,直到每一部分只有一个元素(此时认为是有序......
  • Udemy——Python数据结构与算法(10)
     课程:【Udemy高分付费课程】Python数据结构与算法-终极Python编码面试和计算机科学训练营(中英文字幕)_哔哩哔哩_bilibiliGraph基本代码classGraph:def__init__(self):self.adj_list={}defprint_graph(self):forvertexinself.adj_list......
  • Udemy——Python数据结构与算法(9)
      课程:【Udemy高分付费课程】Python数据结构与算法-终极Python编码面试和计算机科学训练营(中英文字幕)_哔哩哔哩_bilibili哈希表HashTable通过将键(Key)映射到表中一个位置来访问记录,以加快查找速度。简单来说,它就像一个“字典”,你可以通过一个“索引”(键)快速找到对应的内......
  • 分享一个音乐爬虫的python源码
    爬虫源码和打包后的EXE文件放在网盘了,可直接下载功能特点:-支持多个音乐源: -酷狗音乐 -QQ音乐 -咪咕音乐 -网易云音乐 -酷我音乐 -5sing音乐 -千千音乐-搜索功能: -按歌手搜索 -按歌曲名搜索(支持模糊匹配) -支持多关键词组合......
  • 精通Python (3)
    该章节主要讲述 分支结构一,应用场景迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后,我们要根据玩家得到分数......
  • 精通Python (4)
    本章节讲述循环结构一,应用场景我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重......