前中后缀表达式

xiaoxiao2021-03-01  59

X缀表达式

中缀表达式:(a+b)前缀表达式:+ab后缀表达式:ab+

与前缀或后缀记法不同的是,中缀记法中括号是必需的。 计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

中缀表达式

中缀表达式和我们一般的逻辑一样,不过是括号不能省。

前缀表达式

具体做法

人工实现转换

中缀表达式:a+b*c-(d+e)第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e)) 前缀表达式:把运算符号移动到对应的括号前面则变成了:-( +(a *(bc)) +(de)) 把括号去掉:-+a*bc+de 前缀式子出现

后缀表达式

具体做法:

人工实现转换

中缀表达式:a+b*c-(d+e) 第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了: ((a+(b*c))-(d+e)) 后缀表达式:把运算符号移动到对应的括号后面则变成了: ((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+-后缀式子出现

程序逻辑

从表达式头开始扫描 数字时,加入后缀表达式; 运算符: a. 若为 ‘(’,入栈; b. 若为 ‘)’,则依次把栈中的的运算符加入后缀表达式中,直到出现’(’,从栈中删除’(’ ; c. 若为 除括号外的其他运算符, 当其优先级高于除’('以外的栈顶运算符时,直接入栈。 否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止,然后将其自身压入栈中(先出后入)。 ·当扫描的中缀表达式结束时,栈中的的所有运算符出栈;

具体案例:

表达式:3+(2-5)*6/3

步骤后缀表达式栈13+23+(33 2+(-43 2 5 -+53 2 5 -+*63 2 5 - 6 *+/73 2 5 - 6 *3+/83 2 5 - 6 *3 /+

实现代码:

/** * 后序遍历递归实现 * * 左 右 中 * @param node */ public void nextOrder(Node node) { if (node == null) { return; } nextOrder(node.left); nextOrder(node.right); System.out.println(node.data); } /** * 后序遍历非递归实现 * @param node */ public void nextOrder2(Node node) { if (node == null) { return; } Stack<Node> stack = new Stack<>(); Node p = node; while (node != null) { while (node.left != null) { stack.push(node); node = node.left; } while (node != null && (node.right == null || node.right == p)) { System.out.println(node.data); p = node; if (stack.isEmpty()) { return; } node = stack.pop(); } stack.push(node); node = node.right; } }

参考

主要参考百度百科,同时做了一些排版的处理

转载请注明原文地址: https://www.6miu.com/read-3139714.html

最新回复(0)