BM49-表达式求值

题目

请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:0≤∣s∣≤100,保证计算结果始终在整型范围内。

要求:空间复杂度: O(n),时间复杂度 O(n)。

示例1

输入:"1+2"

返回值:3

示例2

输入:"(2*(3-4))*5"

返回值:-10

示例3

输入:"3+2*3*4-1"

返回值:26


代码

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        // 去掉空格并将内容放入字符数组
        char[] arr = s.replaceAll(" ", "").toCharArray();
        Stack<Integer> stack = new Stack<>();
        int num = 0;
        // 初始化符号位
        char sign  = '+';

        for (int i = 0; i < arr.length; i++) {
            // 若为数字则修改num值
            char c = arr[i];
            if (Character.isDigit(c)) {
                num = 10 * num + c - '0';
            }

            // 若遇到括号则找到成对的另一个括号然后对里面的表达式进行递归求值
            if (c == '(') {
                // 由于括号里面可能还有括号,所以利用一个标志位可以找到匹配的括号
                int flg = 1;
                int j = i + 1;
                while (flg > 0) {
                    if (arr[j] == '(') {
                        flg++;
                    }
                    if (arr[j] == ')') {
                        flg--;
                    }
                    j++;
                }
                num = solve(s.substring(i + 1, j - 1));
                // 此时j位于右括号的右边,由于for循环本身就有i++,所以这里让i = j -1即可
                i = j - 1;
            }

            // 由于遇到运算符时将前面的数加入栈中,所以表达式最后一个数也需要进入条件进行入栈
            if (!Character.isDigit(c) || i == arr.length - 1) {
                // 遇到运算符时就将前面的数字加到栈中并将符号位改成当前符号位同时将num置为0
                if (sign == '+') {
                    stack.push(num);
                } else if (sign == '-') {
                    // 遇到负号取相反值再放入栈中
                    stack.push(-num);
                } else if (sign == '*') {
                    // 遇到乘法就直接进行运算再将结果放入栈中
                    stack.push(stack.pop() * num);
                } 
                num = 0;
                sign = c;
            }
        } 
        int ret = 0;

        while (!stack.isEmpty()) {
            // 由于在前面处理过,这里只需要将每个数相加就是最终结果
            ret += stack.pop();
        }
        return ret;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值