Python 栈(Stack)

栈(Stack)是一种常见且重要的数据结构,因其简单的操作逻辑和广泛的应用场景,在计算机科学中扮演了不可替代的角色。本文将解析栈的基本原理、Python 中的实现方法,以及其实际应用场景。

目录

第一部分:栈的基础概念

第二部分:Python 中的栈实现

1. 使用列表实现栈

2. 使用 collections.deque 实现栈

第三部分:栈的实际应用

1. 表达式求值

2. 括号匹配

3. 浏览器的前进后退功能


第一部分:栈的基础概念

栈是一种 后进先出(LIFO, Last In First Out) 的数据结构。也就是说,最后压入栈的数据会最先被取出。

栈的基本操作包括:

  1. Push:将数据压入栈顶。

  2. Pop:从栈顶弹出数据。

  3. Peek/Top:查看栈顶数据,但不移除。

  4. IsEmpty:检查栈是否为空。

栈的应用场景广泛,例如:

  • 表达式求值与括号匹配。

  • 深度优先搜索(DFS)。

  • 实现递归。

  • 浏览器前进后退功能。


第二部分:Python 中的栈实现
1. 使用列表实现栈

Python 的列表(list)天然支持栈的操作,可以通过 appendpop 方法实现。

class Stack:
    def __init__(self):
        self.stack = []

    def push(self, data):
        """将数据压入栈"""
        self.stack.append(data)

    def pop(self):
        """从栈顶弹出数据"""
        if not self.is_empty():
            return self.stack.pop()
        return "Stack is empty"

    def peek(self):
        """查看栈顶数据"""
        if not self.is_empty():
            return self.stack[-1]
        return "Stack is empty"

    def is_empty(self):
        """检查栈是否为空"""
        return len(self.stack) == 0

    def size(self):
        """返回栈的大小"""
        return len(self.stack)

# 测试栈
if __name__ == "__main__":
    stack = Stack()
    stack.push(10)
    stack.push(20)
    stack.push(30)
    print("栈顶元素:", stack.peek())  # 输出: 栈顶元素: 30
    print("弹出元素:", stack.pop())  # 输出: 弹出元素: 30
    print("栈是否为空:", stack.is_empty())  # 输出: 栈是否为空: False
    print("栈的大小:", stack.size())  # 输出: 栈的大小: 2
2. 使用 collections.deque 实现栈

Python 的 collections.deque 是一个双端队列,具有更高效的栈操作。

from collections import deque

class Stack:
    def __init__(self):
        self.stack = deque()

    def push(self, data):
        self.stack.append(data)

    def pop(self):
        if not self.is_empty():
            return self.stack.pop()
        return "Stack is empty"

    def peek(self):
        if not self.is_empty():
            return self.stack[-1]
        return "Stack is empty"

    def is_empty(self):
        return len(self.stack) == 0

    def size(self):
        return len(self.stack)

# 测试栈
if __name__ == "__main__":
    stack = Stack()
    stack.push(100)
    stack.push(200)
    print("栈顶元素:", stack.peek())  # 输出: 栈顶元素: 200
    stack.pop()
    print("栈的大小:", stack.size())  # 输出: 栈的大小: 1

第三部分:栈的实际应用
1. 表达式求值

栈可以用来将中缀表达式转换为后缀表达式,并进行求值。

def evaluate_postfix(expression):
    stack = Stack()
    for char in expression:
        if char.isdigit():
            stack.push(int(char))
        else:
            b = stack.pop()
            a = stack.pop()
            if char == '+':
                stack.push(a + b)
            elif char == '-':
                stack.push(a - b)
            elif char == '*':
                stack.push(a * b)
            elif char == '/':
                stack.push(a / b)
    return stack.pop()

# 测试后缀表达式求值
expr = "23*54*+9-"
print("后缀表达式求值结果:", evaluate_postfix(expr))  # 输出: 17
2. 括号匹配
def is_valid_parentheses(expression):
    stack = Stack()
    matching = {')': '(', ']': '[', '}': '{'}

    for char in expression:
        if char in "([{":
            stack.push(char)
        elif char in ")]}":
            if stack.is_empty() or stack.pop() != matching[char]:
                return False
    return stack.is_empty()

# 测试括号匹配
expr1 = "(a+b)*[c-d]"
expr2 = "(a+b*[c-d)"
print("表达式1括号匹配:", is_valid_parentheses(expr1))  # 输出: True
print("表达式2括号匹配:", is_valid_parentheses(expr2))  # 输出: False
3. 浏览器的前进后退功能

浏览器中,前进和后退操作可以通过两个栈实现。

class Browser:
    def __init__(self):
        self.back_stack = Stack()
        self.forward_stack = Stack()

    def visit(self, url):
        if not self.back_stack.is_empty():
            self.forward_stack = Stack()  # 清空前进栈
        self.back_stack.push(url)

    def back(self):
        if self.back_stack.size() > 1:
            self.forward_stack.push(self.back_stack.pop())
            return self.back_stack.peek()
        return "No more pages to go back"

    def forward(self):
        if not self.forward_stack.is_empty():
            url = self.forward_stack.pop()
            self.back_stack.push(url)
            return url
        return "No more pages to go forward"

# 测试浏览器
browser = Browser()
browser.visit("google.com")
browser.visit("youtube.com")
browser.visit("github.com")
print("后退到:", browser.back())  # 输出: youtube.com
print("前进到:", browser.forward())  # 输出: github.com

你可能感兴趣的:(数据结构,python,python,深度优先,开发语言)