来自《Python数据结构学习笔记》(张清云 编著)
又称堆栈,是一种运算受限的线性表。
class Stack(object):
"""栈"""
def __init__(self):
self._list=[]
def push(self,item):
"""添加一个新的元素item到栈顶"""
self._list.append(item)
def pop(self):
"""弹出栈顶元素"""
return self._list.pop()
def peek(self):
"""返回栈顶元素"""
if sellf._list:
return self._list[-1]
else:
return None
def is_empty(self):
"""判断栈是否为空"""
return self._list==[]
def size(self):
"""返回栈的元素"""
return len(self._list)
if __name__=="__main__":
s=Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
输出:
4
3
2
1
S->top加1
注意:S->top==StackSize-1表示栈满;进行“上溢”现象,即当栈满时,再进行进栈运算产生空间溢出的现象。上溢是一种出错状态,应设法避免。
S->top减1
S->top<0表示此栈是一个空栈。如果进行退栈运算,则将会产生溢出现象。下溢是一种正常的现象,常用作程序控制转移的条件。
#判断栈是否为空,返回布尔值
def is_empty(self):
return self.items==[]
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def push(self,item):
self.items.append(item)
def pop(self,item):
return self.items.pop()
class Stack(object):
#初始化栈为空列表
def __init__(self):
self.items=[]
#判断栈是否为空,返回布尔值
def is_empty(self):
return self.items==[]
#返回栈顶元素
def peek(self):
return self.items[len(self.items)-1]
#返回栈的大小
def size(self):
return len(self.items)
#把新的元素堆进栈里面(入栈)
def push(self,item):
self.items.append(item)
#把栈顶元素丢出去(出栈)
def pop(self,item):
return self.items.pop()
if __name__=="__main__":
#初始化一个栈对象
my_stack=Stack()
#把'h'丢进栈里
my_stack.push('a')
my_stack.push('c')
my_stack.push('d')
my_stack.push('e')
#看一下栈的大小(有几个元素)
print(my_stack.size())
#打印栈顶元素
print(my_stack.peek())
#把栈顶元素丢进去,并打印出来
#print(my_stack.pop())
#再看一下栈顶元素是谁
print(my_stack.peek())
#这个时候栈的大小是多少?
print(my_stack.size())
#再丢一个栈顶元素
print(my_stack.pop())
#看一下栈的大小
print(my_stack.size())
用链表的方式实现栈。
def is_empty(self):
return self._top is None
def top(self):
if self.is_empty():
raise StackUnderflow("in LStack.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 LStack.pop()")
result=self._top.elem
self._top=self._top.next
return result
#链表节点
class Node(object):
def __init__(self,elem,next_=None):
self.elem=elem
self.next=next_
#顺序表实现栈
class SStack(object):
def __init__(self):
self._elems=[]
def is_empty(self):
return self._elems=[]
def top(self):
if self.is_empty():
raise StackUnderflow
return self._elems[-1]
def push(self,elem):
self._elems.append(elem)
def pop(self):
if self.is_empty():
raise StackUnderflow
return self._elems.pop()
#链表实现栈
class LStack(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 LStack.top()")
def push(self,elem):
self._top=Node(elem,self._top)
def pop(self):
if self.is_empty():
raise StackUnderflow("in LStack.pop()")
result=self._top.elem
self._top=self._top.next
return result
if __name__=="__main__":
st1=SStack()
st1.push(3)
st1.push(5)
while not st1.is_empty():
print(st1.pop())
print("==========")
st2=LStack()
st2.push(3)
st2.push(5)
while not st2.is_empty():
print(st2.pop())
输出:
5
3
==========
5
3