判断表达式是否为命题公式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 }

原文地址:https://www.cnblogs.com/weiliuyby/p/8612501.html

时间: 2024-08-28 21:09:19

判断表达式是否为命题公式java编写的相关文章

java编写输入一个数判断是否是回文数,所谓回文数比如121,1221,6778776

package com.hao947; import java.util.Scanner; public class demo5 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int x = 0; x = scanner.nextInt(); System.out.println("请输入一个4-8位的数"); int dig[] = new int[10]; i

Java编写的C语言词法分析器

这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有打开文件.保存文件.打开帮助文档.文本域内容的剪切和复制和黏贴.进行词法分析 程序的项目结构如图,Word类和Unidentifiable类是两个JavaBean类,存放的参数有两个row(整型).word(String),row用于获取行数,word用于获取标识符,LexerFrame是词法分析器的界面类,Analyze封装了进

java编写jmeter压测脚本

目前项目中接触的比较多的是接口测试,功能测个差不多后会对部分接口进行压测,采用的是java编写脚本,导入jmeter进行压测. 使用到的jmeter的相关包 写一个测试类,继承AbstractJavaSamplerClient 设置请求参数,这些参数在导入进jmeter之后会在java请求页面显示出来 具体的请求方法可以写在test方法里,获取请求的结果resultData,然后对resultData里的内容解析,判断接口调用成功or失败 将项目导出成jar包,导入到jmeter中,在jmete

软帝学院教你用java编写计算器(二)

软帝学院教你用java编写计算器(二) import java.awt.BorderLayout; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.

lesson1:Python 判断表达式应用

1/5/2016 判断表达式应用 Sample1: salary=raw_input("please input your salary: ") if salary>=10000: print "you can eat twice!^_^" elif 5000<= salary <10000: print "you only can eat once!-_-" else salary<5000: print "y

java编写Base64密码器

Base64加密算法,应用广泛,尤其是在电子邮件传输上,有很大的用途 用JAVA编写的程序代码如下 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JFrame; import javax.s

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

Java编写最大公约数和最小公倍数

package javaapplication24; class NegativeIntegerException extends Exception{ String message; public NegativeIntegerException(){ message="方法的参数值不是正整数";} public String toString(){ return message;} } class MaxCommonDivisor{ public int getMaxCommonD

Java编写的日期计算方法

自己用Java编写的时间获取类,目前应用在数据交换监控系统中,经测试可以正常使用. 提供以下功能: Time tt = new Time(); System.out.println("获取昨天日期:" + tt.getyd()); System.out.println("获取当天日期:" + tt.getNowTime("yyyy-MM-dd")); System.out.println("获取本周一日期:" + tt.get