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


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

  • 相关阅读:
    Java内存区域
    高并发
    集合框架
    面向对象基础概念
    java synchronized详解
    java使用DOM操作XML
    二、认识Xcode(第一个工程:Hello world)
    菜鸟手下的iOS开发笔记(swift)
    一、iOS开发环境搭建
    一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据
  • 原文地址:https://www.cnblogs.com/zzsaf/p/6773040.html
Copyright © 2020-2023  润新知