计算合式公式(wff) 【让你的离散作业变的更轻松】

本文介绍了一个简单的离散计算解析器实现,支持基本的逻辑运算如括号、析取、合取、否定及条件判断。通过栈来处理运算符优先级和计算过程,确保输入的表达式是合式的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想让你的离散计算变轻松吗???

来这里吧----


支持:(  )  括号,| 析取 ,& 合取 ,! 否定 , > 条件-------暂不支持“  < >  ”  双条件

注意: 符号请按上面的输入--合式P,Q 请直接输入0或1,合式公式中无空格0.0

想要带空格可以自己稍微修改一下-.-


代码:

#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
bool fafe;
int ll,i;
char ch[1000];
int suan(int a,char b,int c)
{
	if (b=='>')
	{
		if (a&&!c)
		return 0;
		else
		return 1;
	}
	if (b=='|')
		return a|c;
	else
		return a&c;
}
int hao()
{
	stack<int>  shu;
	stack<char> fu;
	int x;char cc;
	i++;
	for (;ch[i]!=')';i++)
	{
		if (ch[i]=='(')
		int lp=hao();
		if (!fafe)
			break;
		if (ch[i]=='0'||ch[i]=='1'||ch[i]==')')
		{
			if (ch[i]!=')')
				x=ch[i]-'0';
			if (!fu.empty())
			{
				while (!fu.empty())
				{
					cc=fu.top();
					fu.pop();
					if (cc=='!')
					{
						x=!x;
						if (fu.empty())
						shu.push(x);
					}
					else
					{
						if (!shu.empty())
						{
							int a=shu.top();
							shu.pop();
							a=suan(a,cc,x);
							shu.push(a);
						}
						else
							fafe=false;
						break;
					}
				}
			}
			else
			shu.push(ch[i]-'0');
		}
		else
		fu.push(ch[i]);
	}
//	printf("%d   %d    66\n",fu.size(),shu.size());
	if (!fu.empty()||shu.size()!=1)
	{
		fafe=false;
		return 0;
	}
	else
	return shu.top();
}
int main()
{
	while (~scanf("%s",ch))
	{
		fafe=true;
		ll=strlen(ch);
		stack<int>  shu;
		stack<char> fu;
		int x;char cc;
		for (i=0;i<ll;i++)
		{
			if (ch[i]=='(')
			x=hao();
			if (!fafe)
				break;
			if (ch[i]=='0'||ch[i]=='1'||ch[i]==')')
			{
				if (ch[i]!=')')
					x=ch[i]-'0';
				if (!fu.empty())
				{
					while (!fu.empty())
					{
						cc=fu.top();
						fu.pop();
						if (cc=='!')
						{
							x=!x;
							if (fu.empty())
							shu.push(x);
						}
						else
						{
							if (!shu.empty())
							{
								int a=shu.top();
								shu.pop();
								a=suan(a,cc,x);
								shu.push(a);
							}
							else
								fafe=false;
							break;
						}
					}
				}
				else
				shu.push(ch[i]-'0');
			}
			else
			fu.push(ch[i]);
		}
	//	printf("%d   %d\n",fu.size(),shu.size());
		if (!fu.empty()||shu.size()!=1)
		{
				//printf("%c    99\n",fu.top());
				fafe=false;
		}
	
		if (fafe)
			printf("%d\n",shu.top());
		else
			printf("这不是一个合式\n");
	}
	return 0;
}
/*
1&(0&1)




*/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值