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;
}
}
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实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 蓝桥杯-逆波兰表达式-java
- Java实现逆波兰表达式(Evaluate Reverse Polish Notation)
- Java解析字符串表达式--逆波兰表达式的计算
- 2017 实习生 阿里巴巴 java笔试题 逆波兰表达式
- (学习java)顺序栈实现逆波兰表达式
- 求解逆波兰表达式(前缀表达式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 逆波兰表达式求解
- 阿里17春招实习生笔试编程题:求解单行的逆波兰表达式
- LeetCode-150. Evaluate Reverse Polish Notation (JAVA)逆波兰表达式求值
- C++逆波兰表达式的求解
- java 逆波兰表达式
- java 逆波兰表达式 (后缀表达式) 计算器
- 逆波兰表达式 java
- Java 四则运算表达式求解
- C++的逆波兰表达式的求解
- Leetcode 150:Evaluate Reverse Polish Notation(计算逆波兰表达式) --java实现
- JAVA实现字符表达式的计算的实现(一)--逆波兰式的实现
- 逆波兰表达式的java实现