-
順序是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);
}
}