用单链表实现栈

栈顶位于单链表的头结点处,维护头指针和链表长度;每次压入元素则在头结点前插入新结点,取出元素则删除头结点。

class LinkedStack:
    """单链表实现的栈"""

    class _Node:
        """"""
        __slots__ = "value", "next"  # 因为会创建很多个结点对象,因此使用__slots__来减少内存占用

        def __init__(self, value, next):
            self.value = value
            self.next = next

    def __init__(self):
        self._head = None  # 头指针
        self._size = 0  # 栈中元素的数量

    def __len__(self):
        """返回栈中元素的数量"""
        return self._size

    def is_empty(self):
        """返回栈是否为空"""
        return self._size == 0

    def push(self, value):
        """向栈中压入元素"""
        self._head = self._Node(value, self._head)  # 构造链表对象
        self._size += 1

    def top(self):
        """查询栈顶元素"""
        if self.is_empty():
            raise ValueError("Stack is Empty")
        return self._head.value

    def pop(self):
        """取出栈顶元素"""
        if self.is_empty():
            raise ValueError("Stack is Empty")
        ans = self._head.value
        self._head = self._head.next
        self._size -= 1
        return ans

操作的时间复杂度:

操作 时间复杂度
len(S) O ( 1 ) O(1) O(1)
S.is_empty() O ( 1 ) O(1) O(1)
S.push(value) O ( 1 ) O(1) O(1)
S.top() O ( 1 ) O(1) O(1)
S.pop() O ( 1 ) O(1) O(1)