判断表达式是否为命题公式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 }
以上是 判断表达式是否为命题公式java编写 的全部内容, 来源链接: utcz.com/z/391979.html