给出一个布尔表达式的字符串,比如: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。
输入描述:
输入第一行包含布尔表达式字符串s,s只包含true、false、and、or几个单词(不会出现其它的任何单词),且单词之间用空格分隔。 (1 ≤ |s| ≤ 103).
输出描述:
输出true、false或error,true表示布尔表达式计算为真,false表示布尔表达式计算为假,error表示一个不合法的表达式。
输入例子1:
and
输出例子1:
error
输入例子2:
true and false
输出例子2:
false
输入例子3:
true or false and false
输出例子3:
true
思路:利用栈存放字符串,先计算完所有and,再计算or
注意:
1、用split() 方法把一个字符串分割成字符串数组。
语法
stringObject.split(separator,howmany)
参数 | 描述 |
---|---|
separator | 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。 |
howmany | 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。 |
2、字符串比较时要用equals()方法不能使用"==",String 是对象,如果用==号就是比较两个String对象内存地址是否一样,equals()比较的是String内容时候一样。
package substring;
import java.util.Scanner;
import java.util.Stack;
public class solution{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
String s=scan.nextLine();
scan.close();
String[] str=s.split(" ");
if(str[str.length-1].equals("and")||str[str.length-1].equals("or")||str[0].equals("and")||str[0].equals("or")){
System.out.println("error");
return;
}
if(str.length%2==0){
System.out.println("error");
return;
}
Stack<String> stack=new Stack<String>();
for(int i=str.length-1;i>=0;i--){
if(i%2==0&&(str[i].equals("and")||str[i].equals("or"))){
System.out.println("error");
return;
}
else if(i%2==1&&(str[i].equals("true")||str[i].equals("false"))){
System.out.println("error");
return;
}
else{
String temp=str[i];
if(temp.equals("and")){
temp=stack.pop();
if(temp.equals("false")||str[i-1].equals("false")){
temp="false";
}
else{
temp="true";
}
stack.push(temp);
i--;
}
else{
stack.push(temp);
}
}
}
while(!stack.isEmpty()){
if(stack.pop().equals("true")){
System.out.println("true");
return;
}
}
System.out.println("false");
return;
}
}