合式公式
#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){
right
=i
;
if(isLegal(str
.substr(left
+ 1, right
- left
- 1)) == 0)
return 0;
else
{
str
[left
] = '1';
str
.erase(str
.begin() + left
+ 1, str
.begin() + right
+ 1);
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;
}
转载请注明原文地址: https://yun.8miu.com/read-110569.html