上一篇文章讲述了 中缀表达式 转成 后缀表达式
接着说 中缀表达式 转 前缀表达式
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
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217344.html原文链接:https://javaforall.net
