您的位置:首页 > 编程语言 > Java开发

Java求解逆波兰表达式

2017-04-26 21:49 274 查看
例如下面的字符串就是个逆波兰表达式

2 3  4 * ^ 5 +

逆波兰表达式在一个基于栈的虚拟机中求解,

虚拟机的栈能保存16个整数,

虚拟机从左向右扫描表达式,

遇到整数就压栈,

遇到表达式则从栈顶弹出若干个整数进行计算,

计算结果重新压回栈中。

其中运算符^从栈顶弹出一个整数,

增加1之后压栈;

运算符+和*从栈顶弹出两个整数,

分别做相加和相乘运算后压栈。

如果遇到运算符的时候,

栈内没有足够的整数,称为下溢出,返回-1;

把整数压栈的时候,如果栈没有足够的空间,称为上溢出,返回-2;

如果整个计算过程中没有发生溢出,在整个表达式求解完成后,返回栈顶的整数

使用JAVA自带的Stack来实现,主要是注意每次压栈的时候进行判断。

(当时我考虑了如果是多线程的情况,很可能弹栈计算的时候栈就满了,所以每次压栈的时候都用if判断了一下)

(但是现在我觉得,如果真的要考虑多线程,应该做这个if的时候同步一下代码块,不然可能if之后还是满栈。)

下面是通过了100%的代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Main {

public static void main(String[] args) {

ArrayList<Integer> inputs = new ArrayList<Integer>();
Scanner in = new Scanner(System.in);
String line = in.nextLine();
if(line != null && !line.isEmpty()) {
int res = resolve(line.trim());
System.out.println(String.valueOf(res));
}
}

// write your code here
public static int resolve(String expr) {

Stack<Integer> stack=new Stack();
int result=0;
String stemp;
String [] ss=expr.split(" ");
int itemp=0;
int a,b;

for(int i=0;i<ss.length;i++){
stemp=ss[i];

if(Character.isDigit(stemp.charAt(0))){
if(stack.size()>=16){return -2;}
else {
itemp=Integer.parseInt(stemp);
stack.push(itemp);
}
}

else if(stemp.equals("^")){
itemp=stack.pop();
itemp++;
if(stack.size()>=16){return -2;}
else{ stack.push(itemp);}

}else if(stemp.equals("*")){
if(stack.size()<=1){return -1;}
a=stack.pop();
b=stack.pop();
itemp=a*b;
if(stack.size()>=16){return -2;}
else{ stack.push(itemp);}

}else if(stemp.equals("+")){
if(stack.size()<=1){return -1;}
a=stack.pop();
b=stack.pop();
itemp=a+b;
if(stack.size()>=16){return -2;}
else{ stack.push(itemp);}

}else {//输入有问题,返回空
return (Integer) null;
}
}

result=stack.peek();
return result;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA