合式公式

    xiaoxiao2023-11-01  159

    合式公式

    #include <iostream> #include<string> using namespace std; int main(){ int isLegal(string str); string str; printf("+代表析取 *代表合取 -代表条件 =代表双条件\n"); printf("输入公式:\n"); cin>>str; if(isLegal(str)==0)printf("不合法\n"); else printf("合法\n"); return 0; } int isAtomic(char c){ //判断是否为原子命题 if((c>='a'&&c<='z')||(c>='A'||c<='Z'))return 1; if(c=='0'||c=='1')return 1; return 0; } int isConnect(char c){ //判断联结词 if(c == '*' || c == '+' || c == '-' || c == '=' ) return 1; return 0; } int isLegal(string str){ //判断合法性 int isAtomic(char c); int isConnect(char c); int len,i,j; if(str.length()<1)return 0; //无字符为非法 int left=0,right=0,count=0; for(i=0;i<str.length();i++){ if(str[i]=='(')left=i; else continue; for(;i<str.length();++i){ if(str[i]=='(')count++; if(str[i]==')'){ count--; if(count==0){ //count==0 代表左右括号数相等 right=i; if(isLegal(str.substr(left + 1, right - left - 1)) == 0) //递归判断 return 0; else //将'('变为1,删除')'和括号里的内容 { str[left] = '1'; str.erase(str.begin() + left + 1, str.begin() + right + 1); i = left; //i变为left break; } } } } if(count!=0)return 0; } for(i=0;i<str.length();i++){ //分析和去掉非! if(str[i]=='!'){ if(i==str.length()-1)return 0; if(isConnect(str[i+1]))return 0; else { str.erase(str.begin()+i); i--; } } } for(i=0;i<str.length();i++){ //全部解析完了,奇数位应该是原子命题,偶数为应该为联结词 if(i%2==1&&!isConnect(str[i]))return 0; if(i%2==0&&!isAtomic(str[i]))return 0; } return 1; }
    最新回复(0)