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

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

回到顶部