1、形象表述
堆栈常用来存储数据,它遵循后入先出(last-in rst-out (LIFO))的规则。
下面这张图形象的描述了进栈、出栈的过程:
(a):把数值19压进栈,(b):把数值5压进栈
(c):把值19和5压进栈后产生的堆栈
(d):出栈,从栈顶弹出
2、python实现
对栈我们定义了一些操作函数:
- Stack():创建一个新的空栈
- isEmpty():判断是否空栈,返回布尔数值
- length():返回栈的长度
- push(item):元素进栈
- pop():在堆栈非空的情况下,栈顶元素出栈
- peek():返回栈顶元素,如果堆栈为空,返回错误。
在定义peek()函数时,我们用了断言assert,它的用法:
assert 表达式1,表达式2
如果表达式为真,程序继续执行,不发生中断;
如果表达式1为假,中断程序,并报错,输出表达式2。
堆栈的程序很简单,你不用害怕,你一看就明白了。
具体程序:
应用python列表来实现堆栈
class Stack:
#创建一个空栈
def __init__(self):
self._theItems = list()
#判断栈是空的;如果栈是空的返回True,其他的返回False
def isEmpty(self):
return len(self) == 0
#栈的长度
def __len__(self):
return len(self._theItems)
#进栈
def push(self,item):
self._theItems.append(item)
#出栈
def pop(self):
#如果栈是空的,用断言assert使程序中断
assert not self.isEmpty(),'Cannot pop from an empty stack'
return self._theItems.pop()
#在不删除栈顶元素的情况下,返回栈顶元素
def peek(self):
assert not self.isEmpty(),'Cannot pop from an empty stack'
return self._theItems[-1]
3、堆栈的应用
这是一个用后缀表达式计算数值的例子,可以先忽略。
operators = { # 运算符操作表
'+': lambda op1, op2: op1 + op2,
'-': lambda op1, op2: op1 - op2,
'*': lambda op1, op2: op1 * op2,
'/': lambda op1, op2: op1 / op2,
}
def evalPostfix(list1):
tokens = list1.split()
stack = []
for token in tokens:
if token.isdigit():
stack.append(int(token))
elif token in operators.keys():
f = operators[token]
op2 = stack.pop()
op1 = stack.pop()
stack.append(f(op1, op2))
return stack.pop()