计算str表达式結果

简介: 计算str表达式結果

题目

给定一个字符串str,str表示一个公式,
公式里可能有整数、加减乘除符号和左右括号
返回公式的计算结果,难点在于括号可能嵌套很多层
str="48((70-65)-43)+81",返回-1816。
str="3+1*4",返回7。
str="3+(1*4)",返回7。
【说明】
1.可以认为给定的字符串一定是正确的公式,即不需要对str做公式有效性检查
2.如果是负数,就需要用括号括起来,比如“4(-3)”但如果负数作为公式的开头或括号部分的开头,则可以没有括号,比如"-34"和"(-3*4)"都是合法的。
3.不用考虑计算过程中会发生溢出的情况。

一、解题流程

没有小括号的情况

我们把数字和加减号依次压入栈中,如果遇到乘号或者除号,则先计算乘除

有括号的情况

定义递归函数 f(int i)
从i位置出发,遇到右括号或者整个字符串终止位置停止,返回两个值
1 answer
2.F函数算到哪个位置了遇到左括号就交给递归去搞

代码

    public static int calculate(String str) {
        return f(str.toCharArray(), 0)[0];
    }

    // 请从str[i...]往下算,遇到字符串终止位置或者右括号,就停止
    // 返回两个值,长度为2的数组
    // 0) 负责的这一段的结果是多少
    // 1) 负责的这一段计算到了哪个位置
    public static int[] f(char[] str, int i) {
        LinkedList<String> que = new LinkedList<String>();
        int cur = 0;
        int[] bra = null;
        // 从i出发,开始撸串
        while (i < str.length && str[i] != ')') {
            if (str[i] >= '0' && str[i] <= '9') {
                cur = cur * 10 + str[i++] - '0';
            } else if (str[i] != '(') { // 遇到的是运算符号
                addNum(que, cur);
                que.addLast(String.valueOf(str[i++]));
                cur = 0;
            } else { // 遇到左括号了
                bra = f(str, i + 1);
                cur = bra[0];
                i = bra[1] + 1;
            }
        }
        addNum(que, cur);
        return new int[] { getNum(que), i };
    }

    public static void addNum(LinkedList<String> que, int num) {
        if (!que.isEmpty()) {
            int cur = 0;
            String top = que.pollLast();
            if (top.equals("+") || top.equals("-")) {
                que.addLast(top);
            } else {
                cur = Integer.valueOf(que.pollLast());
                num = top.equals("*") ? (cur * num) : (cur / num);
            }
        }
        que.addLast(String.valueOf(num));
    }

    public static int getNum(LinkedList<String> que) {
        int res = 0;
        boolean add = true;
        String cur = null;
        int num = 0;
        while (!que.isEmpty()) {
            cur = que.pollFirst();
            if (cur.equals("+")) {
                add = true;
            } else if (cur.equals("-")) {
                add = false;
            } else {
                num = Integer.valueOf(cur);
                res += add ? num : (-num);
            }
        }
        return res;
    }
相关文章
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
1229 0
|
10月前
1358:中缀表达式值(expr)
1358:中缀表达式值(expr)
|
7月前
下列给定程序中函数fun的功能是:统计substr所指的子符串在str所指的字符串中出现的次数。
下列给定程序中函数fun的功能是:统计substr所指的子符串在str所指的字符串中出现的次数。
|
8月前
|
存储 算法 C语言
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
36 0
|
9月前
|| 和 && 操作符的返回值?
|| 和 && 首先会对第一个操作数执行条件判断,如果其不是布尔值就先强制转换为布尔类型,然后再执行条件判断。
|
11月前
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
72 0
|
算法
表达式转换-中缀转后缀表达式后计算-数据结构与算法
表达式转换-中缀转后缀表达式后计算-数据结构与算法
335 0
表达式转换-中缀转后缀表达式后计算-数据结构与算法
简单表达式的计算(两种方法)
数据结构中对于栈的运用,最主要的一个例子就是简单表达式的计算了,当你独自将这个程序写出来的时候,这说明你对于栈的运用已经炉火纯青了,下面我将对这个问题做出详细的解答,让我们一起来看看吧
71 0
简单表达式的计算(两种方法)
|
编译器 C语言 C++
C++ c_str() 函数应用
C++ c_str() 函数应用
114 0
|
Java
表达式(int)6.5/7.5*3 的结果数据类型为?
Java中,表达式(int)6.5/7.5*3 的结果数据类型为
392 0