C语言怎么实现合式公式的判断
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要讲解了"C语言怎么实现合式公式的判断",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言怎么实现合式公式的判断"吧!合式公式很明显用递归去
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
广州网络安全检查
数据库单元格只读怎么修改
长沙哪学校学软件开发怎么样
三星手机谷歌商店与服务器
株洲软件开发培训比较好
怎么查询石器时代服务器数据库
软件开发类的国企
软件开发工作需求分析
软件开发副总裁岗位职责
subscience免费数据库
网络安全专题培训ppt
数据库外部接口
橱柜摆放设计软件开发
网络技术的知识储备情况
天地网络安全绘画
csgo服务器怎么进去怎么慢
西安展海互联网科技
vf建立数据库的步骤
公司网络安全管理软件
漯河软件开发规定
e4a怎么导入数据库
计算机三级数据库技术试题
网络安全密钥128
数据库资源耗尽
ibm服务器维修点
世界上网络安全大赛
excel图谱添加数据库
数据库如何改变表格
软件开发 外包团队
上海网络软件开发信息推荐