表达式求值

分为三块,一块处理数字,一块处理括号,一块处理符号。最后将数字加起来放入list即可。

对于上述两个要求,我们要考虑的是两点,一是处理运算优先级的问题,二是处理括号的问题。

处理优先级问题,那必定是乘号有着优先运算的权利,加号减号先一边看,我们甚至可以把减号看成加一个数的相反数,则这里只有乘法和加法,那我们优先处理乘法,遇到乘法,把前一个数和后一个数乘起来,遇到加法就把这些数字都暂时存起来,最后乘法处理完了,就剩余加法,把之前存起来的数字都相加就好了。

处理括号的问题,我们可以将括号中的部分看成一个新的表达式,即一个子问题,因此可以将新的表达式递归地求解,得到一个数字,再运算。

step 1:使用栈辅助处理优先级,默认符号为加号。 step 2:遍历字符串,遇到数字,则将连续的数字字符部分转化为int型数字。 step 3:遇到左括号,则将括号后的部分送入递归,处理子问题;遇到右括号代表已经到了这个子问题的结尾,结束继续遍历字符串,将子问题的加法部分相加为一个数字,返回。 step 4:当遇到符号的时候如果是+,得到的数字正常入栈,如果是-,则将其相反数入栈,如果是*,则将栈中内容弹出与后一个元素相乘再入栈。 step 5:最后将栈中剩余的所有元素,进行一次全部相加。

 public ArrayList<Integer> function(String s,int index){
        Stack<Integer> stack=new Stack<Integer>();
        int num=0;
        char op='+';
        int i;
        for (i=index;i<s.length();i++){
            if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
                num=num*10+s.charAt(i)-'0';
                if(i!=s.length()-1) continue;
            }

            if(s.charAt(i)=='('){
                ArrayList<Integer> res=function(s,i+1);
                num=res.get(0);
                i= res.get(1);
                if(i!=s.length()-1) continue;

            }

            switch (op){

                case '+':
                    stack.push(num);
                    break;
                case '-':
                    stack.push(-num);
                    break;
                case '*':
                    int temp= stack.pop();
                    stack.push(temp*num);
                    break;
            }
            num=0;
            if(s.charAt(i)==')') break;
            else op=s.charAt(i);
        }

        int sum=0;
        while (!stack.isEmpty()) sum+=stack.pop();
        ArrayList<Integer> temp=new ArrayList<Integer>();
        temp.add(sum);
        temp.add(i);
        return temp;

    }

    public int solve (String s) {
        // write code here
        ArrayList<Integer> list=function(s,0);
        return list.get(0);
    }
全部评论

相关推荐

头像
11-27 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗?&nbsp;刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务