算法—四则运算

描述

输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

数据范围:表达式计算结果和过程中满足
输入描述:
输入一个算术表达式

输出描述:
得到计算结果

代码

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        //问题3:括号问题,计算的先后顺序
        s = s.replace("{", "(");
        s = s.replace("[", "(");
        s = s.replace("}", ")");
        s = s.replace("]", ")");
        //1+(8*2-1+3)
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //问题1:第一个数字与(数字,数字为负数的处理 将负数拼接 eg:-3+2*{1+2*[-4/(8-6)+7]}     (0-3)+2*(1+2*((0-4)/(8-6)+7))
            if (c == '-' && (i == 0 || (i > 1 && s.charAt(i - 1) == '('))) {
                stringBuilder.append("(0" + s.charAt(i) + "" + s.charAt(i + 1) + ")");
                i += 1;
            } else {
                stringBuilder.append(c);
            }
        }

        int result = handled(stringBuilder.toString());
        System.out.println(result);
    }

    private static int handled(String s) {
        Stack<Integer> numStack = new Stack<>();//数字栈
        Stack<Character> characterStack = new Stack<>();//字符栈
        int count = 0;//记录当前字符是否是大于10的数字
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                if (!numStack.isEmpty()&&count + 1 == i) {
                    Integer pop = numStack.pop();
                    numStack.push(Integer.valueOf(pop + "" + c));

                } else {
                    count = i;
                    numStack.push(Integer.valueOf(c + ""));
                }
            } else if (c == '(') {
                characterStack.push(c);
            } else if (c == ')') {
                while (!characterStack.isEmpty() && characterStack.peek() != '(') {
                    calcute(characterStack, numStack);
                }
                characterStack.pop();//弹出'('
            } else if (c == '+' || c == '-' || c == '*' || c == '/') {
                //问题2:四则运算顺序,先乘除后加减
                //问题4:使用栈存储数字时计算应从左向右 否则会出现:3*5+8-0*3-6+0+0 15+8-0-6+0+0=29情况
                while (!characterStack.isEmpty() &&
                        getPrecedence(characterStack.peek()) >= getPrecedence(c)) {
                    calcute(characterStack, numStack);
                }
                characterStack.push(c);
            }
        }
        //计算剩余非括号内的算式
        while (!characterStack.isEmpty()) {
            calcute(characterStack, numStack);
        }

        return numStack.pop(); // 返回最终计算结果
    }

    // 获取运算符的优先级
    public static int getPrecedence(char operator) {
        switch (operator) {
            case ')':
                return 0;
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
        }
        return 0;
    }

    //进行计算
    public static void calcute(Stack<Character> characterStack,
                               Stack<Integer> numStack) {
        Integer a = numStack.pop();//先进后出,注意顺序
        Integer b = numStack.pop();
        Character operate = characterStack.pop();
        int result = 0;

        switch (operate) {
            case '-':
                result = b - a;
                break;
            case '+':
                result = b + a;
                break;
            case '*':
                result = b * a;
                break;
            case '/':
                result = b / a;
                break;
        }
        numStack.push(result);
    }
}

相关推荐

  1. 算法四则运算

    2024-05-11 00:16:01       29 阅读
  2. 使用Python进行数学四则运算

    2024-05-11 00:16:01       54 阅读
  3. ZZULIOJ 1003: 两个整数的四则运算

    2024-05-11 00:16:01       46 阅读
  4. 栈-227.基本计算器II(四则运算

    2024-05-11 00:16:01       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 00:16:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 00:16:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 00:16:01       87 阅读
  4. Python语言-面向对象

    2024-05-11 00:16:01       96 阅读

热门阅读

  1. c#读取bin文件

    2024-05-11 00:16:01       30 阅读
  2. GOOGLE翻译V3版

    2024-05-11 00:16:01       35 阅读
  3. L6201PSTR DMOS全桥驱动器

    2024-05-11 00:16:01       30 阅读
  4. Oracle 数据库非归档模式迁移数据文件存放位置

    2024-05-11 00:16:01       30 阅读
  5. 12.Netty入门案例

    2024-05-11 00:16:01       31 阅读
  6. libevent 梳理

    2024-05-11 00:16:01       27 阅读
  7. golang 随机数演化

    2024-05-11 00:16:01       31 阅读
  8. c++ 线程的激活和休眠

    2024-05-11 00:16:01       32 阅读
  9. PHP 在字符中找出重复次数最多的字符

    2024-05-11 00:16:01       28 阅读
  10. 算法有哪些分类

    2024-05-11 00:16:01       36 阅读