7.1 栈ADT
栈(stack)是只允许在一端进行插入或删除元素操作的储存容器,其特点是后进先出(last-in first-out, LIFO)。
其允许插入删除的一端称为栈顶(top),另一端称为栈底(bottom)。没有任何元素时称为空栈。
栈ADT应包含的属性:
- Stack():创建一个空栈;
- isEmpty():判断栈是否为空;
- length():返回栈的元素个数;
- pop():弹出元素,栈的元素个数减一,若为空栈,则引发异常;
- peek():获取栈顶元素,不改变栈的元素个数;
- push(item):将元素item压入栈中,作为新的栈顶,栈的元素个数加一。
#-*-coding: utf-8-*-
# 栈基本操作
PROMPT = "Enter an int value (<0 to end): "
myStack() = Stack()
value = int(raw_input(PROMPT))
while value >= 0:
myStack.push(value)
value = int(raw_input(PROMPT))
while not myStack.isEmpty():
value = myStack.pop()
print value
7.2 栈的实现
栈有两种实现方式,一种是使用python列表(数组也可),另一种是使用链表。前者称为顺序栈,后者称为链式栈。
顺序栈
#-*-coding: utf-8-*-
# 使用Python列表实现栈,即顺序栈
class Stack():
def __init__(self):
self._theItems = list()
def isEmpty(self):
return len(self) == 0
def __len__(self):
return len(self._theItems)
# 返回栈顶
def peek(self):
assert not self.isEmpty(), "Cannot peek at an empty stack."
return self._theItems[-1]
# 列表最后一个元素作为栈顶
def pop(self):
assert not self.isEmpty(), "Cannot pop from an empty stack."
return self._theItems.pop()
def push(self, item):
self._theItems.append(item)
链式栈
#-*-coding: utf-8-*-
# 使用链表实现栈,即链式栈,
class Stack(object):
def __init__(self):
self._top = None
self._size = 0
def isEmpty(self):
return self._top is None
def __len__(self):
return self._size
# 返回栈顶
def peek(self):
assert not self.isEmpty(), "Cannot peek at an empty stack."
return self._top.item
# 首元结点作为栈顶
def pop(self):
assert not self.isEmpty(), "Cannot pop from an empty stack."
node = self._top
self.top = self._top.next
self._size -= 1
return node.item
def push(self, item):
self._top = _StackNode(item, self._top)
self._size += 1
# 链式栈结点的储存类,注意next属性的初始值
class _StackNode(object):
def __init__(self, item, link):
self.item = item
self.next = link
显然,链式栈的时间复杂度都是O(1),比顺序栈要更有效。