表达式的种类:前缀表达式,中缀表达式,后缀表达式(计算机中更常用)。
计算机计算一个用户表达式的流程:
用户从交互端输入一个中缀表达式---->计算机利用栈转成后缀表达式--->计算机再利用已得的表达式计算出结果返回给用户。
(1)中缀转后缀(手算版)
注:这个简单,关键就是先按左优先原则确定运算顺序,然后注意操作数的相对位置就行。
例:
(2) 中缀表达式转后缀表达式(机算)
规则:
用栈实现中缀表达式转后缀表达式:
初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。
从左到右处理各个元素,直到末尾。可能遇到三种情况:
①遇到操作数。直接加入后缀表达式。
②遇到界限符即括号。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到弹出“(” 为止。注意:“(”不加入后缀表达式。
③遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停止,运算符直接入栈,其他你别管。之后再把当前运算符入栈。
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。
来个例子:
(3)后缀表达式的计算
①(手算)
规则:
后缀表达式的手算方法:
从左往右扫描,每遇到一一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为-个操作数
注意:两个操作数的左右顺序,即相对顺序不可调换。
②(机算)
规则:下面某张图,不想抄了。
栗子:
另中缀表达式(机算):
中缀转后缀+后缀表达式求值两个算法的结合
用栈实现中缀表达式的计算:
初始化两个栈,操作数栈和运算符栈
若扫描到操作数,压入操作数栈
若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)
栗子:有点乱,不过我能看懂(狗头)