处理负数运算 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

此计算器主要处理的难点在于负数和减号的区分,它通过在遇到乘号和除号后,根据下一个字符是否为'-'来判断是不是负数,并进行相应的操作,以此来实现对负数的处理。

能处理-2*-5 2*-5 -2*5 等三种带‘-’的情况

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            // 将其他类型的括号替换成小括号,这样可以统一处理
            s = s.replace("{", "(");
            s = s.replace("[", "(");
            s = s.replace("}", ")");
            s = s.replace("]", ")");
            // 在字符串末尾添加"+",为了处理最后一个数字
            s = s + "+";
            // 打印出结果
            System.out.println(slove(s, 0, s.length() - 1));
        }
    }

    public static int slove(String s, int l, int r) {

        Stack<Integer> stack = new Stack<>();
        char[] chs = s.toCharArray();
        int fu = 1;
        // 初始化操作符为'+'
        char sign = '+';
        // 初始化数字为0
        int number = 0;
        // 遍历字符串中的每个字符
        for (int i = 0; i <= r; i++) {

            char ch = chs[i];
            // 如果当前字符是空格,则跳过
            if (ch == ' ') continue;
            // 如果当前字符是数字,则拼接数字
            if (Character.isDigit(ch)) {
                number = number * 10 + ch - '0';
            }
            // 对负数进行处理
            number = fu * Math.abs(number) ;
            // 如果当前字符是'(',说明遇到了一个子表达式
            if (ch == '(') {
                // 找到子表达式的右括号的位置
                int j = i;
                int count = 0;
                for (; i < s.length(); i++) {
                    if (chs[i] == ')') count--;
                    if (chs[i] == '(') count++;
                    // 当遇到的左右括号数量相等时,说明找到了子表达式的右括号
                    if (count == 0) break;
                }
                // 递归处理子表达式
                number = slove(s.substring(j + 1, i) + "+", 0, i - j - 1);
            }
            // 如果当前字符不是数字
            if (!Character.isDigit(ch)) {
                // 根据操作符对数字进行处理,并将结果压入栈
                switch (sign) {
                    case '+':
                        stack.push(number);
                        fu = 1;
                        break;
                    case '-':
                        stack.push(-1 * number);
                        fu = 1;
                        break;
                    case '*':
                        // 处理'-'为负号的情况
                        if (ch == '-' && chs[i - 1] == '*') {
                            fu = -1;
                            continue;
                        } else {
                            stack.push(stack.pop() * number);
                            fu = 1;
                        }
                        break;
                    case '/':
                        // 处理'-'为负号的情况
                        if (ch == '-' && chs[i - 1] == '/') {
                            fu = -1;
                            continue;
                        } else if (stack.peek() != 0) {
                            stack.push(stack.pop() / number);
                            fu = 1;
                        }
                        break;
                }
                // 更新操作符和数字
                sign = ch;
                number = 0;
            }
        }
        // 最后,把栈中的所有数字求和,就得到了最后的结果
        int total = 0;
        while (!stack.isEmpty()) {
            total += stack.pop();
        }
        return total;
    }
}

}

#计算器#
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务