美团校招-表达式求值

题目描述

给出一个布尔表达式的字符串,比如:true or false and false,表达式只包含true,false,and和or,现在要对这个表达式进行布尔求值,计算结果为真时输出true、为假时输出false,不合法的表达时输出error(比如:true true)。表达式求值是注意and 的优先级比 or 要高,比如:true or false and false,等价于 true or (false and false),计算结果是 true。

我的题解

import java.util.Scanner;
public class expression2bool {
    public static void main(String[] args) {
       int res = expression2bool.func();
       if (res==0) System.out.println("error");
       else if (res==1) System.out.println("true");
       else System.out.println("false");
    }

    public static int func(){//0:error  1:true  2:false
        Scanner sc = new Scanner(System.in);
        String inp = sc.nextLine();
        sc.close();
        String []expArr = inp.split(" ");
        int len = expArr.length;
        int arr [] = new int[len];//字符串比较太麻烦,太耗时,转整数。  0:false,1:true, 2:and, 3: or
        if (len%2==0) return 0;//长度为偶数,一定不合法,直接返回
        String exp ;
        char c;
        for (int i=0;i<len;i++){//先转整数,同时判断输入是否合法
            exp= expArr[i];
            c = exp.charAt(0);
            if (i%2==0){
                if (c=='t')arr[i]=1;
                else if (c=='f')arr[i]=0;
                else return 0;
            }else{
                if (c=='o')arr[i]=3;
                else if (c=='a')arr[i]=2;
                else return 0;
            }
        }

        //处理and:把and先计算掉
        for (int i=1;i<len-1;i+=2){
            if (arr[i]==2){
                if (arr[i-1]+arr[i+1]<2){
                    arr[i-1]=0;
                    arr[i+1]=0;
                }
            }
            //这里其实可以优化,如果前面出现true,同时不影响后面的and就可以直接返回true了,不用后面的遍历判断
        }
        //存在一个true即返回true,因为现在只有or,一个true或上任何值都是true
        for (int i=0;i<len;i+=2){
            if (arr[i]==1)return 1;
        }
        return 2;
    }
}
原文地址:https://www.cnblogs.com/XT-xutao/p/12629242.html