定义栈类:
class Stack(object) :
# 初始化栈为空列表
def __init__(self):
self.items = []
# 判断栈是否为空,返回 True 或 False
def is_empty(self):
return self.items == []
# 压栈,添加新元素进栈
def push(self,item):
self.items.append(item)
# 出栈,删除栈顶元素,并返回
# 注:列表的pop()方法用于根据索引删除并返回被删除的元素,没有传入索引参数,默认删除最后一个元素
def pop(self):
return self.items.pop()
# 返回栈顶元素
def peek(self):
return self.items[len(self.items)-1]
# 返回栈的大小
def size(self):
return len(self.items)
if __name__ == "__main__" :
'''
测试
'''
stack = Stack() # 栈类的一个实例对象
stack.push("hello")
stack.push("world")
stack.push("chang")
print(stack.is_empty()) # False
print(stack.size()) # 3
print(stack.peek()) # chang
print(stack.pop()) # chang
print(stack.pop()) # world
print(stack.pop()) # hello
print(stack.is_empty()) # True
PS:从定义栈类的过程中可以看到,栈的一系列操作其实就是列表的操作,当不想通过定义栈类再来实现功能的话,可以直接使用列表来实现
栈的应用之四则运算表达式求值:
步骤:中缀表达式转后缀表达式,通过后缀表达式计算一个算数表达式的值
中缀表达式和后缀表达式的概念:
平时用到的标准的四则运算表达式就叫做中缀表达式,例如“9 +(3 - 1) * 3 + 10 / 2”,特点是运算符在数字中间;
后缀表达式就是一种把运算符放在数字后面的形式,“9 3 1 - 3 * + 10 2 / +” 即为上述中缀表达式对应的后缀表达式形式,后缀表达式还有一个特点就是消除了所有的括号;
中缀表达式能够非常直观地展示出运算关系,很方便手动计算,但是如果要设计一个计算机程序来计算这个表达式却变得非常繁琐,不仅要考虑四则运算的优先级,还要考虑括号的影响,而后缀表达式虽然在表现形式上不直观却非常便于计算机进行计算。
中缀表达式转化为后缀表达式的规则:
中缀表达式转化为后缀表达式要借助栈来实现,这里的栈用于储存运算符号而不是数值。
规则: 从左到右遍历中缀表达式中的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号则要分为两种情况:
-
是括号时,如果是左括号,直接将左括号入栈,如果是右括号则栈顶元素依次出栈并输出,直到有一个左括号出栈(出栈的左括号不输出到后缀表达式)
-
是运算符号时,如果栈顶符号为左括号,则直接将这个运算符号入栈。栈顶符号不为左括号时,如果该运算符号优先级比栈顶运算符号高则入栈,比栈顶符号低或者相等时则栈顶元素依次出栈并输出直到栈为空或者栈顶为左括号为止,然后将这个符号入栈。
最后将栈顶符号依次出栈并输出,得到的结果即为最终的后缀表达式。
实例:
以中缀表达式“9 +(3 - 1) * 3 + 10 / 2”为例推导其后缀表达式的步骤如下:
1、初始化一个空栈
2、第一个数字9直接输出到后缀表达式,