Just do it
专注做自己的事,有想做的事就去做好了
题目解析

栈的数据结构特征是先进后出,我们可以通过反向链表实现这样的结构,也可以通过双向链表实现

一.反向链表实现
  • 定义一个链表
"""单链表"""  
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  # 返回弹出的栈顶元素
posted on 2025-09-30 16:09  Ireck  阅读(5)  评论(0)    收藏  举报