上一篇文章讲述了 中缀表达式 转成 后缀表达式
接着说 中缀表达式 转 前缀表达式
原理相同
中缀表达式: (6+3*(7-4))-8/2
1.直接转换法
-
- 确定表达式的运算方式, 加括号, 给每一次能运算的都加上:
- (6+(3*(7-4)))-8/2
- (6+(3*(7-4)))-(8/2)
- ((6+(3*(7-4)))-(8/2))
- 确定表达式的运算方式, 加括号, 给每一次能运算的都加上:
2.利用栈
以下来自百度百科:
- (1) 首先构造一个
运算符
栈(也可放置括号),运算符(以括号为分界点)在栈内遵循越往栈顶优先级不降低的原则进行排列。 - (2)从
右至左
扫描中缀表达式,从右边第一个字符开始判断:
如果当前字符是数字,则分析到数字串的结尾并将数字串直接输出。
如果是运算符
,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),再将当前运算符入栈。
如果是括号,则根据括号的方向进行处理。如果是向右的括号,则直接入栈;否则,遇向左的括号前将所有的运算符全部出栈并输出,遇右括号后将向左、向右的两括号一起出栈(并不输出)。 - (3) 重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再
逆缀
输出字符串。中缀表达式也就转换为前缀表达式了。
– 如果表达式结束,但栈中还有元素,将所有元素出栈
,添加到前缀表达式中
可能👀看文字有点晕, 直接上图
中缀表达式: (6+3*(7-4))-8/2
-
- 首先分配2个栈
- 首先分配2个栈
-
- 取字符
- 2 运算符 直接入 s2; / 操作符 入 s1;
- 8运算符 入 s2;
- ’ -'操作符 入 s1; 栈顶元素 / 优先级大于 - 所以取出/ 入s2
- 取字符
- )操作符 入 s1;
- )操作符 入 s1;
- 4 运算符 入 s2;
- '- 操作符 入 s1;
- 7运算符 入 s2;
-
(操作符 将- 放入 s2 中, 移除 ( ) 两个;
-
*操作符 入 s1;
-
3 运算符 入 s2;
-
'+ 操作符 , 入s1, 但是 栈顶* 优先级大于 + 所以 * 出栈 入 s2
-
6 运算符 入 s2;
-
( 取出 + 作废 ) ( ;
-
结束 依次取出s1
逆缀
输出 - + 6 * 3-74/82