-
顺序是true and false, 运算符在中间
-
状态转移图要想清楚
-
遇到运算符, 如果栈顶是数值就直接压进去, 不要再去读下一个来计算, 因为我们的运算符在中间
-
遇到数值, 这时再从栈中pop, 这时左中右是完整的, 可以进行计算
- 栈顶是or(优先级低), 直接压栈, 以后处理
- 栈顶是and(优先级高), pop两个, 计算完之后把新值压栈
-
最后and都处理完了, 栈里只剩or和数值了, 再一个个pop就行
import java.util.*;
public class Main {
//判断是不是运算符
static public boolean isOperator(String s){
if(s.equals("and")||s.equals("or")){
return true;
}
return false;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
LinkedList<String> data = new LinkedList<>();
boolean isAnd = false;
while(scan.hasNext()){
String in = scan.next();
//运算符在最左边或者最右边, 就错误
if(Main.isOperator(in)&&(data.isEmpty()||(!scan.hasNext()))){
System.out.println("error");
return;
}
// 检测到运算符
if(Main.isOperator(in)){
//由于已经知道data不为空
String out = data.peek();
//连续两个运算符
if(Main.isOperator(out)){
System.out.println("error");
return;
}else{
// 如果不是, 就直接把操作符压进去
data.push(in);
}
}else{ //检测到数值
if(data.isEmpty()) data.push(in); //如果data是空的话, 直接压进去
else{ //不空的话, 看看栈顶
String out = data.peek();
if(!Main.isOperator(out)){ //如果栈顶还是数值,报错
System.out.println("error");
return;
}else if(out.equals("or")){ //如果栈顶是or, 直接压进去
data.push(in);
}else{ //栈顶是and, 运算完再压
data.pop();
boolean tmp1 = Boolean.parseBoolean(in);
boolean tmp2 = Boolean.parseBoolean(data.pop());
data.push(String.valueOf(tmp1&&tmp2));
}
}
}
}
//现在处理data
boolean res = Boolean.parseBoolean(data.pop());
while(!data.isEmpty()){
data.pop();
boolean new_b = Boolean.parseBoolean(data.pop());
res = res||new_b;
}
System.out.println(res);
}
}