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

Python数据结构进阶:栈与队列的实现与应用

Python数据结构进阶:栈与队列的实现与应用


一、栈(Stack)

1.1 定义与特性

后进先出(LIFO)原则:
最后添加的元素最先被移除
类比场景:网页浏览器的返回按钮、餐厅盘子叠放

1.2 核心操作

操作时间复杂度功能说明
push()O(1)元素入栈
pop()O(1)移除栈顶元素
peek()O(1)查看栈顶元素
is_empty()O(1)判断栈是否为空

1.3 典型应用场景

案例1:括号匹配验证

输入示例:"([{}])" → 有效

错误示例:"({[)]}" → 无效

案例2:逆波兰表达式求值

表达式:["4", "13", "5", "/", "+"] → 等价于 4 + (13 / 5)


二、队列(Queue)

2.1 定义与特性

先进先出(FIFO)原则:
最先添加的元素最先被移除
类比场景:超市结账排队、打印机任务队列

2.2 核心操作

操作时间复杂度功能说明
enqueue()O(1)元素入队
dequeue()O(1)移除队首元素
front()O(1)查看队首元素
is_empty()O(1)判断队列是否为空

2.3 典型应用场景

案例1:任务调度系统

处理顺序:请求1 → 请求2 → 请求3

案例2:广度优先搜索(BFS)

遍历顺序:层级1 → 层级2 → 层级3


三、Python实现代码

3.1 栈的实现(三种方式)

# 方式1:使用列表实现
class ListStack:
    def __init__(self):
        self.items = []
    
    def push(self, item):
        self.items.append(item)
        
    def pop(self):
        return self.items.pop()
    
    def peek(self):
        return self.items[-1] if not self.is_empty() else None
    
    def is_empty(self):
        return len(self.items) == 0

# 方式2:使用collections.deque
from collections import deque
class DequeStack:
    def __init__(self):
        self.container = deque()
    
    def push(self, val):
        self.container.append(val)
        
    def pop(self):
        return self.container.pop()
    
    def peek(self):
        return self.container[-1] if self.container else None

# 方式3:自定义链表实现
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

class LinkedListStack:
    def __init__(self):
        self.top = None
    
    def push(self, item):
        new_node = Node(item)
        new_node.next = self.top
        self.top = new_node
    
    def pop(self):
        if self.top is None:
            raise Exception("Stack is empty")
        value = self.top.value
        self.top = self.top.next
        return value

3.2 队列的实现(两种方式)

# 方式1:使用deque双端队列
from collections import deque
class ListQueue:
    def __init__(self):
        self.items = deque()
    
    def enqueue(self, item):
        self.items.append(item)
    
    def dequeue(self):
        return self.items.popleft() if self.items else None
    
    def front(self):
        return self.items[0] if self.items else None

# 方式2:循环数组实现
class CircularQueue:
    def __init__(self, capacity):
        self.capacity = capacity
        self.queue = [None]*capacity
        self.head = 0
        self.tail = 0
        self.size = 0
    
    def enqueue(self, item):
        if self.size == self.capacity:
            raise Exception("Queue is full")
        self.queue[self.tail] = item
        self.tail = (self.tail + 1) % self.capacity
        self.size += 1
    
    def dequeue(self):
        if self.size == 0:
            return None
        item = self.queue[self.head]
        self.head = (self.head + 1) % self.capacity
        self.size -= 1
        return item

四、每日挑战:括号匹配验证

4.1 问题描述

实现函数 is_valid_parentheses(s)

输入示例: 
"()[]{}" → 返回True
"([)]"   → 返回False
"({[]})" → 返回True

4.2 实现思路

  1. 创建空栈和映射表 {')': '(', ']': '[', '}': '{'}
  2. 遍历每个字符:
    • 左括号:入栈
    • 右括号:检查栈顶是否匹配
  3. 最后检查栈是否为空

4.3 参考答案

def is_valid_parentheses(s: str) -> bool:
    stack = []
    mapping = {')': '(', ']': '[', '}': '{'}
    for char in s:
        if char in mapping.values():
            stack.append(char)
        elif char in mapping.keys():
            if not stack or stack[-1] != mapping[char]:
                return False
            stack.pop()
    return not stack

五、扩展练习

  1. 实现支持最小值查询的栈(要求所有操作O(1)时间复杂度)
  2. 用队列实现栈的push/pop/top操作
  3. 设计循环队列实现(参考Leetcode 622题)
  4. 实现逆波兰表达式计算器(参考Leetcode 150题)

通过这个结构化的教程,学习者可以系统掌握栈和队列的核心概念,并通过代码实践和挑战题目深化理解。建议按照以下学习路径:

  1. 理解基本概念 → 2. 手写实现代码 → 3. 完成每日挑战 → 4. 尝试扩展练习

相关文章:

  • ollama使用教程
  • 我的2025年计划
  • 前OpenAI CTO Mira Murati创办AI新公司
  • 迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存
  • golang panic信息捕获
  • JavaScript数组-数组中新增元素
  • 区块链(13):FISCO BCOS简介及安装
  • 智能指针讲解
  • 深度学习与人工智能资料推荐:DeepSeek整合包全解析
  • 智享AI直播三代系统,马斯克旗下AI人工智能直播工具,媲美DeepSeek!
  • 大摩闭门会:250218 学习总结报告
  • 排序算法:冒泡排序
  • ARM64 Trust Firmware [四]
  • 【鸿蒙开发】第三十八章 ArkTS代码调试
  • Spotify AI 技术(1)使用 TensorFlow 和 TF-Agents
  • 电脑机箱散热风扇声音大的影响因素
  • Linux I2C 命令
  • 最小二乘法原理分析
  • C语言指针学习笔记
  • 深入浅出TypedArray:网络数据处理、WebGPU与加密实战
  • 习近平向多哥新任领导人致贺电
  • 国际奥委会举办研讨会,聚焦如何杜绝操纵比赛
  • 沙青青评《通勤梦魇》︱“人机组合”的通勤之路
  • 费高云不再担任安徽省人民政府副省长
  • “11+2”复式票,宝山购彩者领走大乐透1170万头奖
  • 哲学新书联合书单|远离苏格拉底