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 }
  • 相关阅读:
    elasticsearch-head插件基本使用
    Windows包管理工具-Chocolatey
    php-fpm常用操作
    nginx之日志处理
    进程管理工具之supervisor(完整版)
    Elasticsearch之常见问题
    支付宝支付功能接入(PC)
    UnityWebRequest 高级API常用的操作
    UnityWebRequest
    logback中使用日期做为文件目录
  • 原文地址:https://www.cnblogs.com/weiliuyby/p/8612501.html
Copyright © 2011-2022 走看看