Leetcode--Java--227. 基本计算器 II

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
1 <= s.length <= 3 * 105
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数

样例描述

示例 1:

输入:s = "3+2*2"
输出:7
示例 2:

输入:s = " 3/2 "
输出:1
示例 3:

输入:s = " 3+5 / 2 "
输出:5

思路

表达式求值通用模板
本题思路与这里完全一样,只不过多了运算符优先级的比较。

  1. 用哈希表预先设置运算符优先级大小即可。保证在碰到运算符计算时,栈内的运算符优先级一定要大于当前的运算符优先级才能先计算。
  2. 本思路可以涵盖处理负数。

代码

class Solution {
    Deque<Integer> nums = new LinkedList<>();
    Deque<Character> ops = new LinkedList<>();
    //优先级map
    Map<Character, Integer> map = new HashMap<>();
    public int calculate(String s) {
       s = s.replaceAll(" ", "");
       s = '(' + s + ')';
       map.put('+', 1);
       map.put('-', 1);
       map.put('*', 2);
       map.put('/', 2);
       map.put('^', 3); //求幂,不是亦或
       int n = s.length();
       char ch[] = s.toCharArray();
       for (int i = 0; i < n; i ++ ) {
           char c = ch[i];
           if (isNum(c)) {
               int j = i, x = 0;
               while (j < n && isNum(ch[j])) {
                   x = x * 10 + (int)(ch[j] - '0');
                   j ++;
               }
               i = j - 1;
               nums.addLast(x);
           }
           else if (c == '(') {
               ops.addLast(c);
           }else if (c == ')') {
               while (ops.peekLast() != '(') {
                   eval();
               }
               ops.pollLast();
           } else {
               if (i > 0 && (ch[i - 1] == '+' || ch[i - 1] == '-' || ch[i - 1] == '('))
               nums.addLast(0);
               //如果栈顶的运算符优先级大于等于当前的运算符优先级,才能计算栈内的
                 while (!ops.isEmpty() && ops.peekLast() != '(') {
                  if (map.get(ops.peekLast()) >= map.get(c)) {
                  eval();
               }
                else break;
                   }
                   ops.addLast(c);
           }
       }
       while (!ops.isEmpty()) eval();
       return  nums.peekLast();
           }

    public void eval() {
        // if (nums.isEmpty() || nums.size() < 2) return;
        // if (ops.isEmpty()) return;

        int b = nums.pollLast(), a = nums.pollLast();
        char op = ops.pollLast();
        if (op == '+') nums.addLast(a + b);
        else if (op == '-') nums.addLast(a - b);
        else if (op == '*') nums.addLast(a * b);
        else if (op == '/') nums.addLast(a / b);
        else if (op == '^') nums.addLast((int)Math.pow(a, b));

    }
    public boolean isNum(char c) {
        return Character.isDigit(c);
    }
}

你可能感兴趣的:(Leetcode,表达式计算值,模板题,哈希表)