C语言怎么实现合式公式的判断
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"C语言怎么实现合式公式的判断",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言怎么实现合式公式的判断"吧!合式公式很明显用递归去
千家信息网最后更新 2026年11月03日C语言怎么实现合式公式的判断
这篇文章主要讲解了"C语言怎么实现合式公式的判断",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言怎么实现合式公式的判断"吧!
合式公式
很明显用递归去模拟实现判断过程相对容易。(当然利用栈,循环实现也行,毕竟递归是发生在栈区(函数栈帧),另外递归解决时要处理的细节就很多了,循环会更麻烦)。
由合式公式的定义,很明显
原子公式就是我们递归的出口,确定了出口,剩下就是怎么通过递归算法,递推到这个出口
约定
| 联结词 | 代替 | |
|---|---|---|
| 非 | ! | |
| 合取(^) | *(数量积) | |
| 析取(V) | +(数量和) | |
| 蕴含(->) | > | |
| 等价 | = |
思路
删除否定联结词
思路用一个辅助数组去占时存储非!的字符,之后拷贝到原区间,不过要对原区间进行赋值\0
void Del_Negation(char* str,int n){ assert(str); char* tmp = (char*)calloc(n+1, sizeof(char));//多一个1,是为了放置\0,避免strcpy越界拷贝 assert(tmp); int cnt = 0; int i = 0; while (i < n)//将除!的字符赋值到tmp中 { if (str[i] != '!') { tmp[cnt++] = str[i]; } ++i; } memset(str, 0, sizeof(char)*n);//对str那块内存重新赋值为\0,防止tmp拷贝到str中后,s扔有旧的数据 strcpy(str, tmp); free(tmp); tmp = NULL;}删除括号
删除括号,因为是对首尾进行的删除,这里通过2次strcpy就可以完成
void Del_Bracket( char* str, int left, int right){ assert(str); char* tmp = (char*)calloc(right - left +1+1, sizeof(char)); assert(tmp); str[right] = '\0'; strcpy(tmp, str+left+1); strcpy(str+left, tmp);}第一个联结词的下标
找寻区间中第一双目运算符:找到就返回下标,否则就返回0.
int Find_Fist_operator( char* str, int left, int right){ int ret = 0; while (left' || str[left + 1] == '=') { ret = left + 1; return ret; } ++left; } return 0;//如果ret是0,说明是非法,反之就正确} 判断合式公式
注意区间的操作,不然很容易造成野指针的访问。
bool Is_CombForm(char* str, int left, int right){ if ((0 == (right - left))//区间是原子命题 && ('A' <= str[left] || 'Z' >= str[left])) { return true; } if (str[left] != '(')//第一个字符是字母: A>(B) { int keyi = Find_Fist_operator(str, left, right);//找寻第一个双目运算符 if (keyi > 0) { if (str[keyi + 1] == '(')//A<(B) { Del_Bracket(str, keyi + 1, right); return Is_CombForm(str, left, keyi - 1) && Is_CombForm(str, keyi + 1, right - 2); } else//A [flag+2,right] if (brackt == 0) { Del_Bracket(str, left, flag); if (str[flag + 2] == '(') { Del_Bracket(str, flag + 2, right); return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag+ 2, right - 2); } else { return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag + 2, right); } } } } return false;}所有代码
#define _CRT_SECURE_NO_WARNINGS#include#include #include #include #include #include using namespace std;//思路用一个辅助数组去占时存储非!的字符,之后拷贝到原区间,不过要对原区间进行赋值0void Del_Negation(char* str,int n){ assert(str); char* tmp = (char*)calloc(n+1, sizeof(char));//多一个1,是为了放置\0,避免strcpy越界拷贝 assert(tmp); int cnt = 0; int i = 0; while (i < n)//将除!的字符赋值到tmp中 { if (str[i] != '!') { tmp[cnt++] = str[i]; } ++i; } memset(str, 0, sizeof(char)*n);//对str那块内存重新赋值为\0,防止tmp拷贝到str中后,s扔有旧的数据 strcpy(str, tmp); free(tmp); tmp = NULL;}//删除括号,因为是对首尾进行的删除,这里通过2次strcpy就可以完成void Del_Bracket( char* str, int left, int right){ assert(str); char* tmp = (char*)calloc(right - left +1+1, sizeof(char)); assert(tmp); str[right] = '\0'; strcpy(tmp, str+left+1); strcpy(str+left, tmp);}//判断是否为原子式//因为去除括号的原因,当只有一个字母是原子式,否则不是bool Is_operator(const char* str,int left,int right){ assert(str); if ((0==(right-left)) &&('A' <=str[left]||'Z'>=str[left])) { return true; } return false;}//找寻区间中第一双目运算符:找到就返回下标,否则就返回0.int Find_Fist_operator( char* str, int left, int right){ int ret = 0; while (left ' || str[left + 1] == '=') { ret = left + 1; return ret; } ++left; } return 0;//如果ret是0,说明是非法,反之就正确}bool Is_CombForm(char* str, int left, int right){ if ((0 == (right - left))//区间是原子命题 && ('A' <= str[left] || 'Z' >= str[left])) { return true; } if (str[left] != '(')//第一个字符是字母: A>(B) { int keyi = Find_Fist_operator(str, left, right);//找寻第一个双目运算符 if (keyi > 0) { if (str[keyi + 1] == '(')//A<(B) { Del_Bracket(str, keyi + 1, right); return Is_CombForm(str, left, keyi - 1) && Is_CombForm(str, keyi + 1, right - 2); } else//A [flag+2,right] if (brackt == 0) { Del_Bracket(str, left, flag); if (str[flag + 2] == '(') { Del_Bracket(str, flag + 2, right); return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag+ 2, right - 2); } else { return Is_CombForm(str, left, flag - 2) && Is_CombForm(str, flag + 2, right); } } } } return false;}void Text(char *str){ cout << str; int sz = strlen(str); Del_Negation(str, sz); sz = strlen(str); if (Is_CombForm(str, 0, sz-1)) { printf("-------YES\n"); } else { printf("----------NO\n"); }}int main (){ char arr1[] = "P>!R"; char arr2[] = "!(P>Q)>!R"; char arr3[] = "P>((P*R)>Q)"; char arr4[] = "((P>R)*(Q*(P>R)))=R"; char arr5[] = "((P>Q)>R)>Y"; char arr6[] = "PQ"; char arr7[] = "(P>RT)>Q"; char arr8[] = "((P>Q)*(P>QT))>(R*T)"; Text(arr1); Text(arr2); Text(arr3); Text(arr4); Text(arr5); Text(arr6); Text(arr7); Text(arr8); printf("-------------------------BY New Young\n"); return 0;}
效果
感谢各位的阅读,以上就是"C语言怎么实现合式公式的判断"的内容了,经过本文的学习后,相信大家对C语言怎么实现合式公式的判断这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
区间
公式
合式
双目
字符
拷贝
运算符
运算
原子
递归
语言
思路
括号
下标
字母
就是
出口
学习
联结
明显
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡
互联网科技海报
山东特亿宝互联网科技有限公司
科技互联网企业
互联网科技巨头监管
期待互联网科技
广州宏创互联网科技
银优互联网科技有限公司
唐信互联网科技 大连
新浪科技互联网
狮子座互联网科技培训
丰台科技园 互联网公司
科技大学互联网专业好不好
银川新华互联网科技学校地址
青岛中康互联网医疗科技有限公司
现代互联网科技股
下一代互联网重大应用科技园
郑州欣桑互联网科技有限公司
科技互联网行业投资研究
求路客互联网科技电话
深圳互联网络科技有限公司
美国互联网前沿科技
互联网科技创新企业排名
互联网科技扶贫时间
本届互联网博览会上的黑科技
乌鲁木齐新华智原互联网科技学校
为客找房互联网科技公司怎么样
美国互联网科技实力
互联网科技机房
互联网科技创新方面的资料