【栈】227. 基本计算器 II

227. 基本计算器 II

题目

227. 基本计算器 II

实现一个基本的计算器来计算一个简单的字符串表达式的值。

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

示例 1:

输入: “3+2*2”
输出: 7
示例 2:

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

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

解法

利用栈将四则运算化简成加法运算

此算法的思路很简单,先把乘除法的值计算出来,最终将所有的运算简化成只有加法。

  1. 先跳过空格
  2. 出现了数字则记录整个数字是多少,然后根据之前的运算符决定下一步:
  • 如果是加号’+’,说明前面的运算独立于以后的运算,可以将结果暂时放入栈;
  • 如果是减号’-’,可以看成-1 * tempNum,然后将-tempNum入栈;
  • 如果是乘号’*‘或者除号’/’,由于前面的运算独立于此,可以先计算lastNum和tempNum积,然后结果入栈。
  1. 最后将栈中的所有元素相加就是答案。
public int calculate(String s) {
    
    
        Deque<Integer> stack = new LinkedList<>();
        char[] arr = s.toCharArray();
        char lastOps = '+';
        for (int i = 0; i < s.length(); i++) {
    
    
            // 跳过空格
            if (arr[i] == ' ') {
    
    
                continue;
            }
            if (Character.isDigit(arr[i])) {
    
    
                int tempNum = arr[i] - '0';
                // 如果是数字则继续向后遍历计算出数字
                while (++i < s.length() && Character.isDigit(arr[i])) {
    
    
                    tempNum = tempNum * 10 + arr[i] - '0';
                }
                // 最后多了一个+1的操作,需要-1
                i--;
                // 判断运算符的类型:+则直接入栈、-将相反数入栈、*/则将栈顶元素出栈并运算
                if (lastOps == '+') {
    
    
                    stack.push(tempNum);
                } else if (lastOps == '-') {
    
    
                    stack.push(-tempNum);
                } else if (lastOps == '*') {
    
    
                    stack.push(stack.pop() * tempNum);
                } else {
    
    
                    stack.push(stack.pop() / tempNum);
                }
                // 如果是运算符则记录运算符
            } else {
    
    
                lastOps = arr[i];
            }
        }
        // 计算其中每个运算的值
        int num = 0;
        for (int i : stack) {
    
    
            num += i;
        }
        return num;

猜你喜欢

转载自blog.csdn.net/qq_17677907/article/details/113807274