栈是一种简单的缓冲存储结构,它只支持数据项的存储和访问,不支持数据项之间的任何关系。
栈具有后进先出的特性。
栈的实现:
基于栈的特性,实现一个栈可以基于两种结构,线性表和列表
1. 异常类
class StackUnderflow(ValueError):
pass
2. 基于线性表实现栈
class Stack(object):
def __init__(self):
self._elems = []
def is_empty(self):
return self._elems == []
def top(self):
if self.is_empty():
raise StackUnderflow('in Stack.top()')
return self._elems[-1]
def push(self, elem):
self._elems.append(elem)
def pop(self):
if self.is_empty():
raise StackUnderflow('in Stack.pop()')
return self._elem.pop()
2. 基于链表实现栈
在Python中,list结构是基于动态顺序表实现的,因此不会出现栈满的情况,但是,list需要一块连续的存储空间(1. 空间代价),当存储空间满时需要更换更大的空间,这个扩容的操作代价很高(2. 时间代价);因此,对于这两个问题,使用链表可以很好的解决。
class Node(object):
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
class Stack(object):
def __init__(self):
self.top = None
def is_empty(self):
return self.top is None
def top(self):
if self.is_empty():
raise StackUnderflow('in Stack.top()')
return self.top.elem
def push(self, elem):
self.top = Node(elem, self.top)
def pop(self):
if self.is_empty():
raise StackUnderflow('in Stack.pop()')
p = self.top
self.top = p.next
return p.elem