用单链表实现栈
栈顶位于单链表的头结点处,维护头指针和链表长度;每次压入元素则在头结点前插入新结点,取出元素则删除头结点。
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) |