题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        List<String> midList=midToList(s);//处理两个数字相邻的情况,所以转换为List<String>
        List<String> postList=midToPost(midList);//中缀转后缀
        return compute(postList);//后缀计算
    }
    public List<String> midToList(String s){
        List<String> res=new ArrayList<>();
        char[] c=s.toCharArray();
        String mutiCount="";
        int i=0;
        while(i<c.length){
            if(Character.isDigit(c[i])){//如果是数字要把连续的数字组成一个字符串加入list
                mutiCount+=c[i++];
                while(i<c.length&&Character.isDigit(c[i])){
                    mutiCount+=c[i++];
                }
                res.add(mutiCount);
                mutiCount="";
            }else{//不是数字直接作为字符串加入list
                res.add(c[i++]+"");
            }
        }
        return res;
    }
    public List<String> midToPost(List<String> midList){//中序变后续
        Stack<String> stack=new Stack<>();//符号栈
        List<String> res=new ArrayList<>();
        for(int i=0;i<midList.size();i++){
            String s=midList.get(i);
            if(isNumber(s)){
                res.add(s);
            }else if(s.equals("(")){
                stack.push(s);
            }else if(s.equals(")")){
                String tmp=stack.pop();
                while(!tmp.equals("(")){
                    res.add(tmp);
                    tmp=stack.pop();
                }
            }else if(s.equals("*")||s.equals("/")){//把大于等于此运算符的符号都出栈,直到遇到(或者比此运算符小的
                if(!stack.isEmpty()){
                    while(!stack.isEmpty() && (stack.peek().equals("*")||stack.peek().equals("/")) ){
                        res.add(stack.pop());
                    } 
                }
                stack.push(s);
            }else{//+ - stack中(之前的所有操作符都出来
                if(!stack.isEmpty()){//把大于等于此运算符的符号都出栈,直到遇到(或者比此运算符小的
                    while(!stack.isEmpty() && !stack.peek().equals("(")){
                        res.add(stack.pop());
                    }
                }
                stack.push(s);
            }
        }
        while(!stack.isEmpty()){
            res.add(stack.pop());
        }
        return res;
    }

    public int compute(List<String> postList){
        Stack<Integer> stack=new Stack<>();//操作数栈
        for(int i=0;i<postList.size();i++){
            String s=postList.get(i);
            if(isNumber(s)){
                stack.push(Integer.parseInt(s));
            }else{
                int num2=stack.pop();
                int num1=stack.pop();
                switch(s){
                    case "+":
                        stack.push(num1+num2);
                        break;
                    case "-":
                        stack.push(num1-num2);
                        break;
                    case "*":
                        stack.push(num1*num2);
                        break;
                    case "/":
                        stack.push(num1/num2);
                        break;
                }
            }
        }
        return stack.pop();
    }
    public boolean isNumber(String s){
        for(int i=0;i<s.length();i++){
            if(!Character.isDigit(s.charAt(i))){
                return false;
            }
        }
        return true;
    }

}
全部评论

相关推荐

昨天 15:48
上海交通大学 C++
今天投了小鹏,收到了AI面,大概会问哪些啊?
期末一定及格:总共4个部分,心理测评、行测、然后就是问岗位、对岗位的理解、过往遇到了哪些难点怎么解决,很简单,没有什么特别专业的问题,都是一些综合素质相关的
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
昨天 15:35
武汉大学 运营
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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