程序员面试金典-面试题 16.26. 计算器

题目:

给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。

表达式仅包含非负整数,+, - ,*/ 四种运算符和空格  。 整数除法仅保留整数部分。

示例 1:

输入: "3+2*2"
输出: 7

示例 2:

输入: " 3/2 "
输出: 1

示例 3:

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

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 请不要使用内置的库函数 eval

分析:

先遍历一遍字符串,将需要做加法的数字存进栈中,同时将乘除先计算出结果。减法转换为加法。然后再将栈中的数字遍历加和。

程序:

class Solution {
    public int calculate(String s) {
        char[] arr = s.replaceAll(" ", "").toCharArray();
        Stack<Integer> stack = new Stack<>();
        int res = 0;
        char prev = ' ';
        for(int i = 0; i < arr.length; ++i){
            StringBuilder str = new StringBuilder();
            while(i < arr.length && arr[i] >= '0' && arr[i] <= '9'){
                str.append(arr[i]);
                i++;
            }
            int num = Integer.parseInt(str.toString());
            if(prev == '+'){
                stack.push(num);
            }else if(prev == '-'){
                stack.push(-num);
            }else if(prev == '*'){
                stack.push(stack.pop() * num);
            }else if(prev == '/'){
                stack.push(stack.pop() / num);
            }else{
                stack.push(num);
            }
            if(i < arr.length)
                prev = arr[i];
        }
        while (!stack.isEmpty()) {
            res += stack.pop();
        }
        return res;
    }
}

 

posted @ 2020-03-20 15:14  silentteller  阅读(443)  评论(0编辑  收藏  举报