美团点评2020校招后台开发方向笔试题
给出一个布尔表达式的字符串,比如: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。
一开始考虑了一堆and or的情况,后来看到评论区大家的回答,顿然醒悟,这道题居然是用栈来解答。遇到and的就出栈计算值然后再进栈,最后栈内的元素只剩下true false or,然后再判断如果没有格式错误,存在true结果就为true。为了表达方便,我用list来实现类似栈的功能。
public static void main(String[]args){
Scanner in=new Scanner(System.in);
String ss=in.nextLine();
String []s=ss.split(" ");
List<String>list=new LinkedList<>();
int i=0,flag=0;
boolean res=true;
if(s.length==1)
{
if(s[0].equals("or")||s[0].equals("and"))
System.out.println("error");
else System.out.println(s[0]);
}
else{while(i<s.length)
{
if(!s[i].equals("and"))
list.add(s[i]);
else {
String temp=list.get(list.size()-1);
list.remove(list.size()-1);
i++;
if(temp.equals("false")||s[i].equals("false"))
list.add("false");
else if(temp.equals("true")&&s[i].equals("true"))
list.add("true");
else {flag=1;break;}
}
i++;
}
if(flag==1||s.length%2==0)
System.out.println("error");
else{
int len=list.size();
for(int k=0;k<len;k++)
if(k%2==0)
{
if(list.get(k).equals("or"))
{flag=1;break;}
else if(list.get(k).equals("true"))
flag=2;
}
else {
if(!list.get(k).equals("or"))
{flag=1;break;}
}
if(flag==1)
System.out.println("error");
else if(flag==2)
System.out.println("true");
else System.out.println("false");
}
}
}