Python 如何实现顺序栈
顺序栈是一种使用数组实现的栈结构,其基本特点是后进先出(LIFO,Last In First Out)。在顺序栈中,元素的插入和删除操作都发生在同一端,称为栈顶(Top)。本篇文章将详细介绍如何在 Python 中实现一个顺序栈,包括关键方法、代码示例、用例以及相关的流程图。
一、顺序栈的基本操作
通常,顺序栈主要包含以下几个基本操作:
- 初始化栈:创建一个空栈。
- 入栈 (push):向栈中添加元素。
- 出栈 (pop):从栈中移除顶端元素。
- 获取栈顶元素 (top):查看当前栈顶元素,但不移除它。
- 判断栈是否为空 (is_empty):检查栈是否有元素。
- 获取栈的大小 (size):返回栈中元素的数量。
二、顺序栈的实现细节
在实现顺序栈时,通常会用一个固定大小的数组来存储栈中的元素,以及一个指针(通常称为 top
)来指示栈顶的位置。下面是主要的实现思路:
- 使用列表(array)来存储栈元素。
- 通过一个整型变量
top
来指示当前栈顶元素的位置。
2.1 类定义
我们将使用一个类 ArrayStack
来实现顺序栈,构造函数中初始化需要的数据结构。
2.2 栈的操作
下面是顺序栈的具体实现代码:
class ArrayStack:
def __init__(self, capacity=10):
"""初始化栈,设置容量"""
self.capacity = capacity # 栈的最大容量
self.stack = [] # 使用列表存储栈元素
self.top = -1 # 栈顶指针初始化为 -1,表示栈为空
def is_empty(self):
"""判断栈是否为空"""
return self.top == -1
def size(self):
"""返回栈的当前大小"""
return self.top + 1
def push(self, item):
"""入栈操作"""
if self.size() >= self.capacity:
raise Exception("StackOverflowError: 栈已满,无法入栈!")
self.stack.append(item)
self.top += 1 # 更新栈顶指针
def pop(self):
"""出栈操作"""
if self.is_empty():
raise Exception("StackUnderflowError: 栈为空,无法出栈!")
item = self.stack[self.top] # 获取栈顶元素
self.stack.pop() # 从列表中移除栈顶元素
self.top -= 1 # 更新栈顶指针
return item
def top_element(self):
"""获取栈顶元素"""
if self.is_empty():
raise Exception("EmptyStackError: 栈为空,无法获取栈顶元素!")
return self.stack[self.top]
def __str__(self):
"""返回栈的字符串表示"""
return str(self.stack)
三、使用顺序栈
接下来,我们将展示如何使用 ArrayStack
类进行具体的栈操作。
if __name__ == "__main__":
stack = ArrayStack(5) # 创建一个容量为 5 的顺序栈
# 入栈操作
for i in range(5):
stack.push(i)
print(f"入栈: {i}, 栈状态: {stack}")
# 获取栈顶元素
print(f"当前栈顶元素: {stack.top_element()}")
# 出栈操作
while not stack.is_empty():
popped_element = stack.pop()
print(f"出栈: {popped_element}, 栈状态: {stack}")
以上代码首先创建了一个容量为 5 的栈,然后将 5 个元素依次入栈,并输出栈的状态。接着获取当前栈顶元素,并进行出栈操作,直到栈为空。
四、流程图
为了更清晰地理解顺序栈的操作流程,我们提供了以下流程图:
flowchart TD
A[开始] --> B{选择操作}
B -->|入栈| C[调用 push 方法]
B -->|出栈| D[调用 pop 方法]
B -->|查看栈顶| E[调用 top_element 方法]
B -->|查看大小| F[调用 size 方法]
B -->|是否为空| G[调用 is_empty 方法]
C --> H{栈未满?}
D --> I{栈为空?}
E --> J{栈为空?}
F --> K[返回栈大小]
G --> L[返回是否为空]
H -->|是| M[将元素入栈]
H -->|否| N[抛出溢出异常]
I -->|是| O[抛出空栈异常]
I -->|否| P[返回出栈元素]
J -->|是| Q[抛出空栈异常]
J -->|否| R[返回栈顶元素]
M --> B
P --> B
R --> B
K --> B
L --> B
五、总结
通过上述内容,我们成功地实现了顺序栈的关键功能,并以代码示例的方式展示了如何进行栈的基本操作。实现顺序栈不仅使我们理解了栈这种数据结构的运作原理,也让我们掌握了使用 Python 构建数据结构的能力。在实际应用中,顺序栈可以被用于表达式求值、括号匹配等问题。
希望通过这篇文章,您对顺序栈的实现有了更深入的认识。如有疑问或需要进一步的帮助,欢迎随时咨询!