算法题:先抽象理解算法,算法逻辑转化为数学逻辑,数学逻辑转化为计算机逻辑,代码实现
栈算法案例:中序到后序
例:中序表达式1 (A+B)C-(D-E)(F+G)
► 算法抽象理解:转化为后序表达式1为AB+CDE-FG+-
► 数学逻辑:
○ 中序:优先级和括号两个原则,无括号情况下,乘除大于加减,有括号则为最高优先级
○ 前序:两个数之间的操作符符移到两个数之后,操作符的对象为两个数字,故中序表达式需要看优先级,而后序、前序不需要;
► 计算机逻辑:
○ 数字如何定位
§ 遍历,发现数字则添加进列表
○ 运算符如何定位?
§ 通过中序优先级决定
□ 遇到高等级运算符则加括号?将运算符移到右括号后面,如何生成括号?死循环,pass
□ 手动定义优先级,遇到括号为最高优先级,乘除为第二,加减为第三优先级
® 遇到括号为最高优先级怎么实现?左括号压栈,右括号出栈,则括号内的运算符为最高优先级,如何实现?
◊ 括号和运算符都入栈,遇到右括号则出栈直到左括号出栈匹配成功
□ 乘除运算符怎么实现弹出,触发条件为?
® 通过定义乘除优先级为3,加减为2,左括号为1(防止左括号被非遇到右括号的时候弹出)
® 触发条件为栈顶操作符的优先级值和新的操作符优先级值的比较,若大于或等于则弹出
► 代码逻辑:
○ 遍历中序字符串生成的列表
§ 为左括号,压栈
§ 为数字,append到列表
§ 为操作符,压栈,需判断列表里有没有优先级比它高的操作符,有出栈,无入栈
§ 为右括号,出栈添加到列表,直到出与之匹配的左括号
# encoding:utf-8
# 进击吧
# 2020/8/30 9:46
from pythonds3.basic import Stack
import string
def infix_to_postfix(infix)