求命题公式的真值表及主范式(栈实现)

本文介绍了一种将人类可读的命题逻辑表达式转换为计算机可处理的后缀表达式的方法,并详细阐述了如何使用C++实现这一转换过程,包括操作符优先级比较、后缀表达式生成及真值表计算。

设计思路

首先用一个串来储存使用者所输入的命题表达式,依据人类的思维,会对输入的命题公式进行分析和计算,但计算机可不会,这时我们就要写入相关代码把使用者输入的命题表达式转换为计算机所能进行计算的后缀表达式,我们用计算机进行对数字相关运算时也是这个原理!首先用一个字符串来储存遍历命题表达式所遇到的命题变元,之后遇到操作符时就利用开发者根据C++运算符优先级自定义的操作符优先级函数对操作符的优先级比较来判断操作符是否要压入创建的字符栈,等这些工作都做完了,最终字符栈内储存的就是操作符,而字符串储存的都是变元,然后将字符栈内的操作符全部出栈,储存到字符串中。这样字符串里储存的就是命题公式的后缀表达式,之后要对后缀表达式进行计算!
例:
系统使用者输入的命题表达式为:!p&q|r
经过转化,后缀表达式为:pqr|&!
如果要想计算表达式,首先遍历后缀表达式,然后遇到操作符时,根据它是几元运算符,来对前面的变元进行逻辑运算,比如这里首先遍历到的是|,由于他是二元运算符,这时进行的运算是q|r,那么问题来了,如果把运算符直接出栈进行运算,这时进行的运算就是p|q,这时不符合运算要求的!
所以这时候我们根据栈先进后出的特性,再建造一个数字栈,首先进行储存的是各个变元的真值,这时候可以发现他就解决了前面逻辑运算遇到的问题,之后再根据遇到的操作符类型进行逻辑运算,边出栈边压栈,最终经过计算,数字栈储存的就剩一个数字,这个数字就是该命题公式的真值,最后根据命题表达式的真值和主析取范式用于判断真,主合取范式用于判断假的特性来对用数组对命题公式变元真值的各种情况进行储存,最后根据主范式特性来进行主范式的输出。

重要步骤

  • 操作符优先级的比较
  • 中缀表达式转后缀表达式
  • 字符栈内操作符的储存
  • 数字栈内真值情况的储存
  • 逻辑运算的进行
  • 主范式的输出

实现代码

#include<iostream>
#include<cctype>
#include<set>
#include<string>
#include<stack>
using namespace std;
#define Max 1000
int Array_one[Max][3]={
   
   0},Array_two[Max][3]={
   
   0},Counter_one=0,Counter_two=0;//储存各个变元的真值,计数器
string s;//串s,储存命题公式
stack<char> Stack;//创建字符栈
stack<int> Num;//创建数字栈
char save[Max],c;//用于储存后缀表达式和临时字符
int follow=0;//计数器
int p,q,r;//用于储存真值
int Amp();//操作符优先级比较函数
void Transform();//中缀表达式转后缀表达式
void fei();//非运算
void yu();//与运算
void huo();//或运算
void tiaojian();//条件运算
void Shuangtiaojian();//双条件运算
void Truenum();//真值运算
void Output_xiqu();//输出主析取式
void Output_hequ();//输出主合取式
int main()
{
   
   
	cout<<"------------------------------------------------欢迎您进入三元逻辑运算系统---------------------------------------------"<<endl;
	cout<<"变元为p,q,r"<<endl;
	cout<<"! 非运算,& 与运算,| 或运算,> 条件运算,$ 双条件运算,( 左括号,) 右括号"<<endl;
	cout<<"请输入命题公式!"<<endl;
	cin>>s;
	Transform();
	cout<<"\t\t\t**真值表**"<<endl;
	cout<<"p\t\t"<<"q\t\t"<<"r\t\t"<<s<<endl;
	Truenum();
	Output_hequ();
	Output_xiqu();
	cout<<endl;
	cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$第一小组制作$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<<endl;
	cout<<"小组成员:"<<endl;
	cout
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无所畏惧的man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值