提取题意,考虑是正向判断还是反向判断比较关键.
命令只能由小写字母/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");
}
}import java.util.ArrayList;
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
ArrayList<String> Orders = new ArrayList<String>();
// 得到所有多行输入
while(sc.hasNextLine()){
String l = sc.nextLine();
Orders.add(l);
// 底下这一行卡死多少英雄好汉:读到换行的空行,结束控制台读取
if(l.equals("")){
break;
}
}
Test test = new Test();
// 从第0行开始
int t =0;
while( t < Orders.size()-1){
// 对每一行进行判断
String line = Orders.get(t++);
System.out.println("line: "+line);
// 命令如果是空行
if(line.length() == 0){
test.print(0);
}else{
//以空格分割每个命令
String[] orders = line.split(" ");
boolean flag = true;
// 如果不是空行,对每一个元素进行判断(对语义进行判断)
for(String order : orders){
if(! test.isIllegalType(order)){
flag = false;
break;
}
}
// 对语法规则判断
if(flag && test.isIllegalContent(orders))
test.print(1);
}
}
sc.close();
}
public boolean isIllegalType(String order){
if(order.length() == 1){
// 不在小写字母范围不合法
if(order.charAt(0) <'a'|| order.charAt(0) > 'z'){
this.print(0);
return false;
// 不是OR命令不合法
}else if(order.length() == 2){
if(!order.equals("OR")){
this.print(0);
return false;
}
// 不是"AND"或者"NOT"命令不合法
}else if(order.length()==3){
if(!(order.equals("AND") || order.equals("NOT"))){
this.print(0);
return false;
}
}
}
return true;
}
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 void print(int i) {
switch(i){
case 0:System.out.println("0");
case 1:System.out.println("1");
}
}
}