棧是一個LIFO數據結構,也就是後進去的元素先出來,棧中的元素沒有任何的
相互關聯,棧可以實現的操作也很簡單,除了建立空棧,判斷空棧外,只有對
棧頂壓入元素,彈出元素,查看棧頂元素。
我們通過順序表和鏈接表依次來實現一個棧的類:
通過順序表實現:
class StackOverFlow(ValueError):
pass
class Stack:
maxElem = 9
# 指定棧最大能存儲的元素數量
# 注意一點是我們在這裏利用python數組實現的棧結構,所以棧
# 是不會被填滿的,在這裏添加一個maxElem類屬性只是假設有一個
# 棧有一個最大值
def __init__(self):
self._elem = []
def is_empty(self):
if not self._elem:
return True
return False
def push(self, elem):
if len(self._elem) == Stack.maxElem:
print("棧已滿,無法加入")
raise StackOverFlow
self._elem.append(elem)
def pop(self):
if len(self._elem) == 0:
raise StackOverFlow("棧爲空,幹嘛刪")
return self._elem.pop()
def get_top(self):
if len(self._elem) == 0:
raise StackOverFlow("棧爲空,無法拿")
return self._elem[-1]
通過鏈接表實現:
class StackOverFlow(ValueError):
pass
class Node:
def __init__(self, elem=None, lnext=None):
self.elem = elem
self.next = lnext
class Stack:
def __init__(self):
self._head = None
def is_empty(self):
return self._head == None
def push(self, elem):
new_node = Node(elem, self._head)
self._head = new_node
def pop(self):
if self._head == None:
raise StackOverFlow("棧爲空")
elem = self._head.elem
self._head = self._head.next
return elem
def top(self):
if self._head == None:
raise StackOverFlow("棧爲空")
return self._head.elem