判断表达式是否为命题公式java编写

  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 }
原文地址:https://www.cnblogs.com/weiliuyby/p/8612501.html