1 定义
栈(STACK)是一种数据结构,栈中的元素在插入和删除时遵循后进先出(last in first output)(LIFO)原则。
2 应用场景
很多情况下都需要用到栈,比如:
(1)浏览器的最近浏览地址,就存在栈中,当你点击返回后,就退回到最近打开的地址页面。
(2)文本编辑器的撤销机制。
(3)最直观的例子:弹夹。后压入的子弹总是先出来,所以你可以将栈看做是一个弹夹。(子弹的入口,同样是出口,作为栈顶,弹夹的末端作为栈底)
(4)实现数据序列的逆置。
(5)用来检查一个文档中括号的对应关系或者HTML中的标签的对应关系。
3 基本操作
用S表示栈,e表示栈中的元素:
(1) S.push(e) ---- 将e添加到栈顶。
(2) S.pop( ) ---- 将栈顶元素移除并返回栈顶元素。(如果栈是空的,此操作将会出错)
(3) S.top( ) ---- 返回栈顶元素,并不移除。 (如果栈是空的,此操作将会出错)
(4) S.is_empty( ) ---- 如果栈为空,则返回True,否则返回False。
(5) len(S) ---- 返回栈中元素个数。
4 基于列表的栈的实现
用基于Python的列表(list)类型来实现栈这种数据结构。
分析:list中已经有L.append()、L.pop()、len(L)、L[-1]的操作。将list作为栈的话,则list的最后一个元素的位置就是栈顶。所以通过改造list就可以得到栈。
代码实现如下:
首先要定义一个异常,用来处理当栈中没有元素的时候,S.pop(),以及S.top()的异常抛出。
class Empty(Exception):
"""Error attempting to access an element from an empty stack"""
pass
之后开始定义
class ListStack():
def __init__(self):
self._data=[]
def __len__(self):
return len(self._data)
def is_empty(self):
return len(self._data)==0
def push(self,e):
self._data.append(e)
def top(self):
if self.is_empty()
raise Empty('Stark is empty')
return self._data[-1]
def pop(self):
if self.is_empty()
raise Empty('Stark is empty')
return self._data.pop()
五 基于链表的栈的实现
分析:把带头的链表的首节点作为栈顶。
代码:
class Lnode();
def __init__(self,x=None):
self.data = x
self.next = None
class MyStack():
def __init__(self):
self.data = None
self.next = None
def is_empty(self): #这里的self就代表链表的头指针,self.next就是首节点
if self.next = None:
return True
else:
return False
def size():
size = 0
p = self.next
while p !=None: #这里必须遍历到链表尾部才能知道有多少个元素
size+=1
p = p.next
return size
def push(size,e); #入栈
p = Lnode()
p.data = e
p.next = self.next #新增节点,挂载在头节点之后,成为新的首节点
self.next = p
def pop(self): #出栈,返回栈顶元素
tmp= self.next
if tmp != None:
self.next =tmp.next
return tmp.data
print("stack is empty!")
return None
def top(self): #返回栈顶元素
if self.next == None:
print("stack is empty!")
return None
return self.next.data