中序表达式:我们直观看到的表达式。
中序表达式转前序表达式:就是从右向左历遍表达式,操作数在前,操作符在后的一种形式。
中序表达式转后序表达式:就是从左致右的历遍表达式,操作数在前,操作符在后的一种形式。
参考博客:
http://www.jianshu.com/p/a052eb2806a1(这篇是讲解中序表达式历遍前序表达式和后序表达式的)
思路:
1.分为两个Stack,一个存放数据的Stack<String> data;
另一存放操作数的Stack<String> ops;
2.历遍并改变存储的方式:
先为两个操作数,然后是操作符。
逻辑如图:
代码如下:
public class InfixToPostfix {
public static void
main (String [] args){
Stack<String> data =
new Stack<>()
;
Stack<String> ops =
new Stack<>()
;
String[] inputs = StdIn.
readAllStrings()
;
for (String input : inputs){
if (input.equals(
"(")){
continue;
}
else if (input.equals(
")")){
if (data.isEmpty()){
StdOut.
println(
"Stack data is Empty!")
;
return;
}
if (ops.isEmpty()){
StdOut.
println(
"Stack ops is Empty!")
;
return;
}
String data1 = data.pop()
;
String data2 = data.pop()
;
String op = ops.pop()
;
String result = data2 + data1 + op
;
data.push(result)
;
}
else if (input.equals(
"+") || input.equals(
"-")
|| input.equals(
"*") || input.equals(
"/")){
ops.push(input)
;
}
else {
data.push(input)
;
}
}
StdOut.
println(
"the end is : " + data.pop())
;
}
}
测试结果:
如果要求输出表达式的结果,前面已经有实现,这里从新写一遍就好:
代码如下:
package chapter1.a3
;
import edu.princeton.cs.algs4.Stack
;
import edu.princeton.cs.algs4.StdIn
;
import edu.princeton.cs.algs4.StdOut
;
public class EvaluatePostfix {
public static void
evaluatePostfix(String[] inputs){
Stack<String> ops =
new Stack<>()
;
Stack<Double> data =
new Stack<>()
;
for (String input : inputs){
if (input.equals(
"(")){
continue;
}
else if (input.equals(
")")){
if (ops.isEmpty()){
StdOut.
println(
"Stack ops is Empty!")
;
return;
}
if (data.isEmpty()){
StdOut.
println(
"Stack data us Empty!")
;
return;
}
String op = ops.pop()
;
Double data1 = data.pop()
;
Double data2 = data.pop()
;
Double result =
0.0
;
if (op.equals(
"+")){
result = data2 + data1
;
}
else if (op.equals(
"-")){
result = data2 - data1
;
}
else if (op.equals(
"*")){
result = data2 * data1
;
}
else if (op.equals(
"/")){
result = data2 / data1
;
}
data.push(result)
;
}
else if (input.equals(
"+") || input.equals(
"-")
|| input.equals(
"*") || input.equals(
"/")){
ops.push(input)
;
}
else {
data.push(Double.
parseDouble(input))
;
}
}
StdOut.
println(
"The Result is " + data.pop())
;
}
public static void
main(String [] args){
String [] inputs = StdIn.
readAllStrings()
;
InfixToPostfix.
infixToPostfix(inputs)
;
evaluatePostfix(inputs)
;
}
}
运行结果: