笔试_阿里_逆波兰表达式
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 题目:
* 一个对于一个单行的逆波兰表达式,由如下元素构成:
* 数字:十进制数字字符构成的正整数,比如 223
* 运算符:支持三种运算符^+和*,分别代表自增,加法和乘法
* 分隔符:一个或者多个空格
* 例如下面的字符串就是个逆波兰表达式
* 2 3 4 * ^ 5 +
* 逆波兰表达式在一个基于栈的虚拟机中求解,虚拟机的栈能保存16个整数,虚拟机从左向右扫描表达式,
* 遇到整数就压栈,遇到表达式则从栈顶弹出若干个整数进行计算,计算结果重新压回栈中。
* 其中运算符^从栈顶弹出一个整数,增加1之后压栈;运算符+和*从栈顶弹出两个整数,分别做相加和相乘运算后压栈。
* 如果遇到运算符的时候,栈内没有足够的整数,称为下溢出,返回-1;把整数压栈的时候,
* 如果栈没有足够的空间,称为上溢出,返回-2;如果整个计算过程中没有发生溢出,在整个表达式求解完成后,返回栈顶的整数。
*/
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));
}
}
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
// write your code here
public static int resolve(String expr) {
int flag = 0;
String[] c = expr.split("\\s+");
List<Integer> lists = new ArrayList<Integer>();
for (int i = 0; i < c.length; i++) {
if (isNumeric(c[i])) {
if (flag < 16) {
int q = Integer.parseInt(c[i]);
lists.add(q);
flag++;
} else
return -2;
}
if (c[i].equals("^")) {
if (lists.isEmpty())
return -1;
else {
int n = lists.get(lists.size() - 1);
lists.remove(lists.size() - 1);
n += 1;
lists.add(n);
}
}
if (c[i].equals("+")) {
if (lists.size() - 2 < 0)
return -1;
else {
int n1 = lists.get(lists.size() - 1);
int n2 = lists.get(lists.size() - 2);
lists.remove(lists.size() - 1);
lists.remove(lists.size() - 1);
n1 += n2;
lists.add(n1);
}
}
if (c[i].equals("*")) {
if (lists.size() - 2 < 0)
return -1;
else {
int n11 = lists.get(lists.size() - 1);
lists.remove(lists.size() - 1);
int n22 = lists.get(lists.size() - 1);
lists.remove(lists.size() - 1);
n11 *= n22;
lists.add(n11);
}
}
}
return lists.get(lists.size() - 1);
}
}
开始时我的把所有数字都当成一位数以及一个空格的分隔符来看,通过率只有40%,是利用String.toCharArray()方法,后来还是使用判断一个或多个空格的正则表达式将其变成String数组。谨记String类型作比较时==和equals()的区别!!!

浙公网安备 33010602011771号