1 import java.util.Scanner; 2 3 public class express { 4 public static void main(String[] args) throws Exception{ 5 System.out.println("请输入表达式:"); 6 Scanner exp = new Scanner(System.in); 7 String expressNew = exp.nextLine(); 8 9 boolean answer = verify(expressNew); 10 11 if(answer == true){ 12 System.out.println("这个表达式是一个命题公式。"); 13 } 14 else System.out.println("这个表达式不是一个命题公式。"); 15 exp.close(); 16 } 17 18 public static boolean verify(String exp){ 19 int i,j; 20 char sign1,sign2; 21 String exp1,exp2; 22 23 i = exp.length(); 24 //单字符 25 if(i == 1){ 26 sign1 = exp.charAt(i-1); 27 if(sign1 >= ‘a‘&& sign1 <= ‘z‘ || sign1 >= ‘A‘ && sign1 <= ‘Z‘){ 28 return true; 29 } 30 else return false; 31 } 32 if(i ==2 ){ 33 sign1 = exp.charAt(0); 34 sign2 = exp.charAt(1); 35 if(sign1 == ‘!‘ && (sign2 >= ‘a‘&& sign2 <= ‘z‘ || sign2 >= ‘A‘ && sign2 <= ‘Z‘ )){ 36 return true; 37 } 38 else return false; 39 } 40 if(i == 3){ 41 if(exp.charAt(0) == ‘(‘ && exp.charAt(2) == ‘)‘){ 42 return verify(String.valueOf(exp.charAt(1))); 43 } 44 else if(exp.charAt(1)==‘&‘||exp.charAt(1)==‘|‘||exp.charAt(1)==‘~‘){ 45 return verify(String.valueOf(exp.charAt(0)))&&verify(String.valueOf(exp.charAt(2))); 46 } 47 else{ 48 return false; 49 } 50 } 51 if (i >= 4) // 公式的长度不能是2和3,因此直接从长度为4的字符串判断 52 { 53 if ((exp.charAt(0) == ‘(‘) && (exp.charAt(i - 1) == ‘)‘)) // 当字符串的第一个符号和最后一个符号为‘(‘和‘)‘时,才有可能是一个公式 54 { 55 if (exp.charAt(1) == ‘!‘) // 当第二个符号是否定符号的情况 56 { 57 exp1 = exp.substring(2, i - 1); // 取出字符串的子字符串sub1,递归判断其是否是公式 58 if (verify(exp1)) { 59 return true; 60 } else { 61 return false; 62 } 63 } else if (exp.charAt(1) == ‘(‘) // 当第二个符号是‘(‘符号的情况 64 { 65 j = find(exp, 1, i - 2); // find(string,int,int)用于确定与该‘(‘匹配的‘)‘的位置 66 if (j== -1 || j == i - 2 || j == i - 3) { // 匹配括号后,后面必须留出两个字符出来。 67 return false; 68 } else { 69 exp1 = exp.substring(1, j+1); 70 exp2 = exp.substring(j + 2, i - 1); 71 72 if ((exp.charAt(j + 1) == ‘&‘ || exp.charAt(j) == ‘|‘||exp.charAt(1)==‘~‘) 73 && verify(exp1) && verify(exp2)) { 74 return true; 75 } else { 76 return false; 77 } 78 } 79 } else if (exp.charAt(1) >= ‘a‘&& exp.charAt(1) <= ‘z‘ || exp.charAt(1) >= ‘A‘ && exp.charAt(1) <= ‘Z‘) // 当第二个符号为原子式时,取余下部 80 { // 分设为sub1,判断sub2是否为公式, 81 if (i == 4) { 82 return false;// 此种情况必须大于等于5 83 } else { 84 if (exp.charAt(2) == ‘&‘ || exp.charAt(2) == ‘|‘||exp.charAt(1)==‘~‘)// 字符串才是公式 85 { 86 exp1 = exp.substring(3, i - 1); 87 if (verify(exp1)) { 88 return true; 89 } else { 90 return false; 91 } 92 } else { 93 return false; 94 } 95 } 96 } else { 97 return false; 98 } 99 } else { 100 return false; 101 }// end >=4 102 } else { 103 return false; // 其他长度的字符串和其他情况的字符串都不是公式 104 } 105 } 106 107 public static int find(String s, int begin, int end) { 108 int n1 = 0, n2 = 0, i = begin; 109 while (i <= end) { 110 if (s.charAt(i) == ‘(‘) 111 n1++; 112 else if (s.charAt(i) == ‘)‘) 113 n2++; 114 else{ 115 } 116 if (n1 == n2) 117 break; 118 i++; 119 } 120 if (i > begin && i <= end) 121 return i; 122 else 123 return -1; 124 } 125 126 }