zoukankan      html  css  js  c++  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 }
  • 相关阅读:
    tensorflow 2.0 学习 (十) 拟合与过拟合问题
    tensorflow 2.0 学习 (九) tensorboard可视化功能认识
    tensorflow 2.0 学习 (八) keras模块的认识
    tensorflow 2.0 学习 (七) 反向传播代码逐步实现
    tensorflow 2.0 学习 (六) Himmelblua函数求极值
    tensorflow 2.0 学习 (五)MPG全连接网络训练与测试
    arp协议简单介绍
    Pthread spinlock自旋锁
    线程和进程状态
    内核态(内核空间)和用户态(用户空间)的区别和联系·
  • 原文地址:https://www.cnblogs.com/weiliuyby/p/8612501.html
Copyright © 2011-2022 走看看