笔试_阿里_逆波兰表达式

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

原文地址:https://www.cnblogs.com/zzsaf/p/6773040.html