中序表达式 转为 后序表达式(包含了输出运行的结果)(1310 P102)

来源:互联网 发布:office mac 更新补丁 编辑:程序博客网 时间:2024/04/29 17:47
中序表达式:我们直观看到的表达式。

中序表达式转前序表达式:就是从右向左历遍表达式,操作数在前,操作符在后的一种形式。

中序表达式转后序表达式:就是从左致右的历遍表达式,操作数在前,操作符在后的一种形式。

参考博客:
http://blog.csdn.net/zhufenghao/article/details/48863163
http://www.jianshu.com/p/a052eb2806a1(这篇是讲解中序表达式历遍前序表达式和后序表达式的)
http://blog.csdn.net/furzoom/article/details/52871716

思路:
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);
}
}
运行结果:

阅读全文
0 0