zl老师布置的作业,网上代码都好长,自己写一个才200行
自己写就是很开心,抄代码有什么意思呢
/*
符号注记:
+ * - -> <-> T F
合取 析取 非 单条件 双条件 true false
运用的方法:
1.将中缀表达式转换为后缀表达式便于计算
2.DFS二进制枚举每个状态并用后缀表达式求值,得到真值表
3.根据真值表打印主析取函数和主合取函数
修改:
1.0 修改增加了条件和双条件符号的判定
2.0 修改了将“T”和“F”也作为命题变元判定的错误
(结尾附样例输入输出)
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<stack>
#define go(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define ll long long
#define N 10005
#define MOD 1000000007
using namespace std;
char s[N];
char a[N];
map<ll,int>m;
stack<char> stk;
void workit1(){
while (!stk.empty()) stk.pop();
int len=strlen(s), k=0;
go(i,0,len-1){
if (s[i]>='A'&&s[i]<='Z'){
a[k++]=s[i];
}
else if (s[i]==')'){
while (stk.top()!='('){
a[k++]=stk.top();
stk.pop();
}
stk.pop();
}
else{
if (s[i]=='-'&&s[i]!='>'){
while (!stk.empty()&&stk.top()=='-'){
a[k++]=stk.top();