基本数据结构-栈

以下是关于 栈(Stack) 的详细说明、Python 实现以及应用案例,使用 Markdown 格式进行排版:


一、线性数据结构

1. 定义

  • 线性数据结构:是一类数据容器,数据元素之间的顺序由添加或删除的顺序决定。一旦元素被添加,它相对于其他元素的位置保持不变。
  • 特点
    • 具有两端(如顶部和底部、前端和后端等)。
    • 区别不同线性数据结构的关键在于添加和移除元素的方式及位置。

2. 常见的线性数据结构

  • 栈(Stack):后进先出(LIFO)。
  • 队列(Queue):先进先出(FIFO)。
  • 双向队列(Deque):两端均可添加和移除元素。
  • 列表(List):支持任意位置的插入和删除操作。

二、栈(Stack)

1. 概念

  • 定义:栈是一个有序集合,添加和移除元素的操作总是在同一端进行,这一端称为 栈顶(Top),另一端称为 栈底(Bottom)
  • 特性
    • LIFO(后进先出):最后添加的元素最先被移除。
    • 栈底:存储时间最长的元素位于栈底。
    • 栈顶:最近添加的元素位于栈顶。

2. 案例

  • 自助餐厅的托盘堆:从顶部取用,新托盘从顶部添加。
  • 书堆:只有顶部的书可以直接访问,其他书需要先移除上面的书。
  • Python 对象栈:栈中存储多个对象,栈顶存储最近添加的对象。

3. 分析与应用

  • 分析:栈的重要特性是能够反转元素的顺序。插入和删除的顺序相反。
  • 应用
    • 浏览器的返回按钮:浏览的网页地址存储在栈中,按返回按钮时按相反顺序访问。
    • 函数调用栈:程序运行时,函数调用按栈的方式管理。
    • 括号匹配:检查括号是否正确匹配。

三、Python 实现栈

1. 栈的抽象数据类型定义

  • 操作
    • Stack():创建一个空的栈,返回一个空栈。
    • push(item):将一个新项添加到栈顶,需要一个参数 item,不返回任何内容。
    • pop():从栈中删除栈顶项,返回被移除的元素。
    • peek():返回栈顶项,但不移除它。
    • isEmpty():检查栈是否为空,返回布尔值。
    • size():返回栈中的元素数量,返回一个整数。

2. Python 实现

class Stack:
    def __init__(self):
        """创建一个空的栈"""
        self.items = []

    def isEmpty(self):
        """检查栈是否为空"""
        return self.items == []

    def push(self, item):
        """将一个新项添加到栈顶"""
        self.items.append(item)

    def pop(self):
        """从栈中删除栈顶项"""
        if not self.isEmpty():
            return self.items.pop()
        else:
            raise IndexError("pop from empty stack")

    def peek(self):
        """返回栈顶项,但不移除它"""
        if not self.isEmpty():
            return self.items[-1]
        else:
            raise IndexError("peek from empty stack")

    def size(self):
        """返回栈中的元素数量"""
        return len(self.items)

3. 使用示例

s = Stack()

# 检查栈是否为空
print(s.isEmpty())  # True

# 添加元素
s.push(4)
s.push('dog')
print(s.peek())     # 输出: dog
s.push(True)
print(s.size())     # 输出: 3
print(s.isEmpty())  # 输出: False
s.push(8.4)

# 移除元素
print(s.pop())      # 输出: 8.4
print(s.pop())      # 输出: True
print(s.size())     # 输出: 2

四、应用案例

1. 括号匹配

  • 问题:检查括号是否正确匹配。
  • 实现
def parChecker(symbolString):
    s = Stack()
    balanced = True
    index = 0

    while index < len(symbolString) and balanced:
        symbol = symbolString[index]
        if symbol == "(":
            s.push(symbol)
        else:
            if s.isEmpty():
                balanced = False
            else:
                s.pop()

        index += 1

    return balanced and s.isEmpty()

print(parChecker("((()))"))  # True
print(parChecker("(()"))     # False

2. 十进制转二进制

  • 问题:将十进制数转换为二进制。
  • 实现
def divideBy2(decNumber):
    s = Stack()

    while decNumber > 0:
        s.push(decNumber % 2)
        decNumber = decNumber // 2

    binString = ""
    while not s.isEmpty():
        binString += str(s.pop())

    return binString

print(divideBy2(42))  # 输出: 101010

五、总结

  • 栈的特性:后进先出(LIFO),适用于需要反转顺序的场景。
  • Python 实现:通过列表操作实现栈的基本功能。
  • 应用:括号匹配、十进制转二进制、函数调用栈等。

希望这些内容能帮助你更好地理解栈的基本概念及其应用!

posted @ 2021-07-13 15:09  杨梅杨梅  阅读(93)  评论(0)    收藏  举报