题目解析
栈的数据结构特征是先进后出,我们可以通过反向链表实现这样的结构,也可以通过双向链表实现
一.反向链表实现
- 定义一个链表
"""单链表"""
class ListNode:
def __init__(self, value, next=None):
self.next = next
self.val = value
- 定义栈
class Stack:
def __init__(self):
self.head = None # 栈底节点(链表头节点)
self.tail = None # 栈顶节点(链表尾节点)
self.size = 0 # 栈中元素个数
- 判空
def is_empty(self):
# 检查栈是否为空
return self.size == 0
- 获取栈元素个数
def get_size(self):
# 返回栈中元素的个数
return self.size
- 入栈
def push(self, value):
"""入栈操作:将元素压入栈顶"""
node = ListNode(value)
if self.is_empty():
# 栈为空时,新节点既是栈底也是栈顶
self.head = node
self.tail = node
else:
# 栈非空时:新节点指向当前栈顶,然后更新栈顶为新节点
# 构建从栈顶到栈底的反向链表:新节点 → 原栈顶 → ... → 栈底
node.next = self.tail
self.tail = node
self.size += 1
- 查看栈顶元素
def peek(self):
"""查看栈顶元素但不弹出"""
if self.is_empty():
raise IndexError("Stack is empty")
else:
return self.tail.val # 返回栈顶节点的值
- 出栈
def pop(self):
"""出栈操作:弹出并返回栈顶元素"""
if self.is_empty():
raise IndexError("Stack is empty")
value = self.tail.val # 保存栈顶元素值
if self.size == 1:
# 栈中只有一个元素,弹出后栈变为空
self.head = None
self.tail = None
else:
# 栈中有多个元素:将栈顶指向下一个节点(即原栈顶的前一个节点)
node = self.tail.next # 获取新的栈顶候选节点
self.tail.next = None # 断开原栈顶节点的链接
self.tail = node # 更新栈顶为新节点
self.size -= 1
return value # 返回弹出的元素值
使用双向链表实现
- 定义双向链表
class ListNode:
def __init__(self, value, next=None, prev=None):
self.val = value # 节点存储的值
self.next = next # 指向下一个节点的指针
self.prev = prev # 指向前一个节点的指针
- 定义栈
class Stack:
def __init__(self):
# 初始化空栈:头指针、尾指针和大小都设为初始值
self.head = None # 栈底节点(链表头部)
self.tail = None # 栈顶节点(链表尾部)
self.size = 0 # 栈中元素个数
- 判空
def is_empty(self):
# 检查栈是否为空
return self.size == 0
- 获取栈元素个数
def get_size(self):
# 返回栈中元素的个数
return self.size
- 入栈
def push(self, value):
# 入栈操作:将元素压入栈顶
node = ListNode(value) # 创建新节点
if self.size == 0:
# 如果栈为空,新节点既是头节点也是尾节点
self.head = node
self.tail = node
else:
# 如果栈不为空,将新节点连接到链表尾部
node.prev = self.tail # 新节点的前驱指向当前尾节点
self.tail.next = node # 当前尾节点的后继指向新节点
self.tail = node # 更新尾指针为新节点
self.size += 1 # 栈大小加1
return self.size # 返回当前栈的大小
- 查看栈顶元素
def peek(self):
# 查看栈顶元素但不弹出
if self.is_empty():
raise IndexError("Stack is empty") # 栈为空时抛出异常
else:
return self.tail.val # 返回尾节点(栈顶)的值
- 出栈
def pop(self):
# 出栈操作:弹出并返回栈顶元素
if self.is_empty():
raise IndexError("Stack is empty") # 栈为空时抛出异常
value = self.tail.val # 保存栈顶元素的值
if self.size == 1:
# 如果栈中只有一个元素,弹出后栈变为空
self.head = None
self.tail = None
else:
# 如果栈中有多个元素,将尾指针前移一位
self.tail = self.tail.prev # 尾指针指向前一个节点
self.tail.next = None # 新的尾节点的后继设为None
self.size -= 1 # 栈大小减1
return value # 返回弹出的栈顶元素
浙公网安备 33010602011771号