提取題意,考慮是正向判斷還是反向判斷比較關鍵.
命令只能由小寫字母/AND/OR/NOT組成,不能有括號,不能由NOT開頭且NOT不可以雙否定.
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(final String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<String> Orders = new ArrayList<>();
// 得到所有多行輸入
while(sc.hasNextLine()){
String l = sc.nextLine();
// 底下這一行卡死多少英雄好漢:讀到換行的空行,結束控制檯讀取
Orders.add(l);
if( l.equals("") )
break;// 這一行不會讀到"\n"...
}
Test test = new Test();
int t=0;
while (t < Orders.size()) {
// 對每一行進行判斷
String line = Orders.get(t++);
// 命令如果是空行
if(line.length() == 0 ){
test.print(0);
}else{
String[] orders = line.split(" ");
// 如果不是空行,對每一個元素進行判斷(對語義進行判斷)
for(String tmp : orders){
if(test.isIllegalType(tmp))
break;
}
// 對語法規則判斷
if(test.isIllegalContent(orders))
test.print(1);
}
}
sc.close();
}
public boolean isIllegalContent(String[] orders){
// 是否用"NOT"開頭
if(orders[0].equals("NOT")){
this.print(0);
return false;
}else{
// 判斷是否兩個"NOT"連續
for(int i=0;i<orders.length-1;i++)
if(orders[i].equals("NOT") && orders[i+1].equals("NOT") ){
this.print(0);
return false;
}
}
return true;
}
public boolean isIllegalType(String tmp){
// 是否是小寫字母
if(tmp.length() == 1){
if(!( tmp.charAt(0) >='a'&& tmp.charAt(0) <= 'z' )){
this.print(0);
return true;
}
}
// 是否是"OR"
else if(tmp.length() == 2){
if(! tmp.equals("OR")){
this.print(0);
return true;
}
}
// 是否是"AND"||"NOT"
else if(tmp.length() == 3){
if(!( tmp.equals("AND" )|| tmp.equals("NOT"))){
this.print(0);
return true;
}
}
return false;
}
public void print(int i){
if(i==0)
System.out.println("0");
else if (i==1)
System.out.println("1");
}
}