中序表达式转前序后序表达式
转前序
首先
按顺序用括号将中序表达式括起来:
例如:6+2 * 9/3+4 * 2-8 ---> (((6+((2 * 9)/3))+(4 *2))-8)
然后
用括号内,距离左括号最近的运算符代替左括号得:
从最外面的左括号开始往内替换:
-((6+((2 * 9)/3))+(4 *2))8
-+(6+((2 * 9)/3))(4 *2)8
-++6((2 * 9)/3)(4 *2)8
-++6/(2 * 9)3(4 *2)8
-++6/ * 293(4 *2)8
-++6/ * 293 * 428
同理,转后序
首先
按顺序用括号将中序表达式括起来:
例如:6+2 * 9/3+4 * 2-8 ---> (((6+((2 * 9)/3))+(4 *2))-8)
然后
用括号内,距离右括号最近的运算符代替右括号得:
从最外面的右括号开始往内替换:
((6+((2 * 9)/3))+(4 *2))8-
(6+((2 * 9)/3))(4 *2)+8-
(6+((2 * 9)/3))42 *+8-
6((2 * 9)/3)+42 *+8-
6(2 * 9)3/+42 *+8-
62 9 * 3/+42 *+8-
前、后序表达式的计算
前序
创建两个堆栈:表达式堆栈用来存放表达式,然后,依次从后往前弹出数到操作数栈,不用考虑优先级。
表达式堆栈:-++6/ * 293*428
操作数堆栈:
表达式堆栈 | 操作数堆栈 |
---|---|
-++6/ * 293*428 | null |
-++6/ * 293* | 824 |
-++6/ * 293 | 8(4*2) |
-++6/ * | 8(4*2)392 |
-++6/ | 8(4 * 2)3(9 * 2) |
-++6 | 8(4 * 2)((9 * 2)/3) |
-++ | 8(4* 2)((9 * 2)/3)6 |
-+ | 8(4 * 2)(6+((9 * 2)/3)) |
- | 8((6+((9 * 2)/3))+(4* 2)) |
中序
后序
创建两个堆栈:表达式堆栈用来存放表达式,然后,依次从前往后弹出数到操作数栈,不用考虑优先级。
表达式堆栈:AB CD+*E/-
操作数堆栈:
表达式堆栈 | 操作数堆栈 |
---|---|
AB CD+*E/- | null |
+*E/- | AB CD |
*E/- | AB (C+D) |
E/- | A(B*(C+D)) |
/- | A(B*C+D))E |
- | A((B*C+D))/E) |
null | A-((B*C+D))/E) |