栈(Stack)是一种基础的抽象数据类型,它遵循“后进先出”(LIFO,Last In First Out)的原则。也就是说,最后放入栈中的元素最先被移除。栈在计算机科学中有广泛的应用,例如在函数调用管理、表达式求值、语法分析等领域。
一、栈的基本概念
1. 操作
压栈(Push):将一个元素添加到栈顶。
弹栈(Pop):移除并返回栈顶的元素。
查看栈顶元素(Peek/Top):返回栈顶的元素,但不移除它。
检查栈是否为空(IsEmpty):判断栈中是否有元素。
2. 特性
顺序性:栈内元素有明确的序列,后入的元素在前面。
有限性:栈有固定的容量,如果栈满,再进行压栈操作会导致溢出(stack overflow)。
限制性:只能在栈顶添加和移除元素,无法随机访问。
二、栈的实现方式
栈可以通过数组或链表来实现:
1. 数组实现
使用一个数组来存储栈中的元素。
栈顶的指针指向当前栈顶元素的位置。
2. 链表实现
使用链表的头部作为栈的顶端,动态地进行内存分配。
三、栈的应用
函数调用管理:使用栈来保存函数调用中的局部变量、返回地址等信息。
表达式求值:转换和求值时可以使用栈,例如中缀表达式转换为后缀表达式(逆波兰表达式)。
括号匹配:实现语法检查程序,检查表达式中的括号是否匹配。
四、栈的优缺点
优点:
简单高效:栈的基本操作(压栈和弹栈)时间复杂度都为 O(1),效率高。
灵活性:栈能够动态扩展(在链表实现的情况下),可以处理不定数量的数据。
缺点:
容量限制:在数组实现中,栈的大小是固定的,可能会导致溢出。
只能访问栈顶元素:无法直接访问栈中的其他元素。
五、示例代码(Python)
以下是一个简单的栈实现示例,使用数组(列表)来实现栈:
class Stack(object):
def __init__(self):
# 用列表存储栈的元素
self.item = []
# 判断栈是否为空,True 为
def is_empty(self):
return len(self.item) == 0
def push(self, item):
'''
压栈
:param item: 元素
:return:
'''
self.item.append(item)
# 遍历
def travel(self):
for i in self.item:
print(i)
# 弹栈/出栈
def pop(self):
if self.is_empty():
raise IndexError('栈为空')
# 弹栈/出栈
return self.item.pop()
# 查看栈顶元素
def peek(self):
if self.is_empty():
raise IndexError('栈为空')
return self.item[-1]
# 返回栈长度
def size(self):
return len(self.item)
if __name__ == '__main__':
# 实例化对象stack
stack = Stack()
# 判断栈是否为空
print(stack.is_empty()) # False
print('-' * 20)
# 压栈
stack.push(1)
stack.push(2)
stack.push(3)
stack.travel() # 1 2 3
print('-' * 20)
# 弹栈/出栈
stack.pop()
stack.travel() # 1 2
print('-' * 20)
# 看栈顶元素
print(stack.peek()) # 2
print('-' * 20)
# 返回栈长度
print(stack.size()) # 2
六、总结
栈是一种简单而强大的数据结构,通过理解栈的基本操作和应用场景,可以更好地应对许多计算机科学问题。栈不仅是基础算法的核心,同时也是实现许多高级数据结构(如树和图)和算法(如深度优先搜索)的基础。