题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String s = in.next();
            if(!isLeft(s.charAt(0))){
                 s="("+s+")";//方便计算,计算方式极度依赖 ')'
            }
            Deque<String> numStk =new ArrayDeque<>();
            Deque<Character> flagStk =new ArrayDeque<>();
            for(int i=0;i<s.length();i++){
                char cc =s.charAt(i);
                if(isNum(cc)){//数字,取数,入数栈
                    int endIndex =getFullNumEndIndex(s,i);
                    String num =s.substring(i,endIndex+1);
                    //负数处理,题目不明确,这里只有(-1 这种形式的处理, 可能还有 *-1、/-1 未考虑
                    if(i-2>0 && '-'==s.charAt(i-1) && isLeft(s.charAt(i-2))){
                        flagStk.removeFirst();
                        num="-"+num;
                    }
                    numStk.addFirst(num);
                    i=endIndex;
                    continue;
                }
                if(isAdd(cc) || isMul(cc) || isLeft(cc)){//符号入符号栈
                    flagStk.addFirst(cc);
                    continue;
                }
                //剩下的情况就是右括号了,匹配到右括号不入栈,而是弹栈一直到左括号为止
                String num="0";
                while(!isLeft(flagStk.getFirst())){
                    char flag =flagStk.removeFirst();
                    if(isMul(flag)){
                        String n2=numStk.removeFirst();
                        String n1=numStk.removeFirst();
                        numStk.addFirst(compute(n1,flag,n2));
                    }else{
                        String n2=numStk.removeFirst();
                        num=compute(num,flag,n2);
                    }
                }
                flagStk.removeFirst();
                numStk.addFirst(compute(numStk.removeFirst(),'+',num));
            }
            System.out.println(numStk.removeFirst());
            
        }
    }

    public static String compute(String n1,char flag,String n2){
        switch(flag){
            case '+' :
                return String.valueOf(Integer.valueOf(n1)+Integer.valueOf(n2));
            case '-' :
                return String.valueOf(Integer.valueOf(n1)-Integer.valueOf(n2));
            case '*' :
                return String.valueOf(Integer.valueOf(n1)*Integer.valueOf(n2));
            case '/' :
                return String.valueOf(Integer.valueOf(n1)/Integer.valueOf(n2));
            default :
             return "0";
        }
    }

    public static boolean isNum(char cc) {
        return cc>='0' && cc<='9';
    }
    public static boolean isAdd(char cc) {
        return cc=='+' || cc =='-';
    }
    public static boolean isMul(char cc) {
        return cc=='*' || cc =='/';
    }
    public static boolean isLeft(char cc) {
        String left="([{";
        return left.contains(cc+"");
    }
    public static boolean isRight(char cc) {
        String right=")]}";
        return right.contains(cc+"");
    }

    public static int getFullNumEndIndex(String s,int fstNumIndex){
        if(fstNumIndex+1==s.length()) 
            return fstNumIndex;
        while(fstNumIndex<s.length() && isNum(s.charAt(fstNumIndex+1))){
           fstNumIndex++;
        }
        return fstNumIndex;

    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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