华为编程题:求算术表达式的值

本文介绍了一种求解算术表达式值的方法,通过符号和数字队列操作,处理加减乘除运算,适用于处理字符串形式的数学问题。代码实例和测试用例展示了如何处理如 '-2-11+2*2*2-9' 这样的表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	/**
     * 求算术表达式的值
     * <p>
     * 思路:
     * 一个数字队列, 一个符号队列
     * 先往符号队列中添加正号, 表示开始累加
     * 遍历完了字符串后, 给数字队列和符号队列填充值
     * 遍历符号队列, 如果是加号, 就把当前数字 重新添加到数字队列末尾
     * 如果是减号, 就把数字取反, 添加到队列末尾
     * 如果是乘号, 那么就从数字队列首位各取一位相乘后放到数字队列末尾
     * 如果是除号, 那么就从数字队列首位各取一位相除后放到数字队列尾部
     *
     * @param s	算术表达式字符串(只包含数字、‘+’、’-‘、‘*’和’/‘符号)
     * @return
     */
    public static int T1(String s) {
        // 数字链表
        LinkedList<Double> numbers = new LinkedList<>();
        // 符号链表
        LinkedList<Character> characters = new LinkedList<>();

        for (int i = 0; i < s.length(); i++) {
            int j = i;
            char c = s.charAt(i);

            if (c == '+' || c == '-' || c == '*' || c == '/' || c == '÷') {
                // 依次放入符号链表
                characters.add(c);
            } else if ((c <= '9' && c >= '0') || c == '.') {
                i++;
                for (; i < s.length(); i++) {
                    c = s.charAt(i);
                    if ((c <= '9' && c >= '0') || c == '.') {

                    } else {
                        break;
                    }
                }

                double num = Double.parseDouble(s.substring(j, i));
                // 依次放入数字链表
                numbers.add(num);
                i--;
            }
        }

        if (numbers.size() != characters.size()) {
            characters.addFirst('+');
        }

        Character c;
        while ((c = characters.pollFirst()) != null) {
            // 如果是加或减,那么就把当前拿出来数字 加/减到数字列表末尾
            // 如果是除或乘,那么就把列表末尾的数字和首位数字拿出来,进行乘/除
            // 比如 6/2,被处理后,符号是 + / ,数字是6 2, '+'号使得6被放在了末尾,变成2 6, '/'号的时候,从末尾拿数字6当做被除数,
            // 头部拿数字2当除数,那么就是6 ÷ 2 = 3
            if (c == '+') {
                numbers.add(numbers.pollFirst());
            }
            if (c == '-') {
                numbers.add(-numbers.pollFirst());
            }
            if (c == '*') {
                numbers.add(numbers.pollFirst() * numbers.pollLast());
            }
            if (c == '/' || c == '÷') {
                numbers.add(numbers.pollLast() / numbers.pollFirst());
            }
        }
        double result = 0;
        Double d;
        while ((d = numbers.pollFirst()) != null) {
            result += d;
        }

        return result;
    }

测试案例:

        System.out.println(T1("-2-11+2*2*2-9"));
        System.out.println(T1("+2-11+2*2*2-9"));
        System.out.println(T1("*2-11+2*2*2-9"));
        System.out.println(T1("2-1+2*2*2-91"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值