基本数据结构-栈
以下是关于 栈(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 实现:通过列表操作实现栈的基本功能。
- 应用:括号匹配、十进制转二进制、函数调用栈等。
希望这些内容能帮助你更好地理解栈的基本概念及其应用!