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

中序表达式:我们直观看到的表达式。

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

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

参考博客:
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) ;
}
}
运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值