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()的区别!!!