判斷表達式是否為命題公式java編寫
阿新 • • 發佈:2018-03-20
throw expr OS AR lin span 命題 pos 可能
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 9boolean answer = verify(expressNew); 10 11 if(answer == true){ 12 System.out.println("這個表達式是一個命題公式。"); 13 } 14 else System.out.println("這個表達式不是一個命題公式。"); 15 exp.close(); 16 } 17 18 publicstatic 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 }
判斷表達式是否為命題公式java編寫