#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
struct TreeNode
{
union{
char var;
bool value;
};
TreeNode *rchild,*lchild;
TreeNode(char ch,TreeNode*r=NULL,TreeNode*l=NULL)
:var(ch),rchild(r),lchild(l){}
TreeNode(bool val):value(val){}
};
bool isoperator(char ch)
{
if(ch=='|'||ch=='&'||ch=='~'||ch=='('||ch==')')
return true;
else
return false;
}
int GetPriority(char ch)
{
if(ch=='~')
return 3;
else if(ch=='|'||ch=='&')
return 1;
else if(ch=='(')
return 2;
else if(ch=='#')
return 0;
else
return -1;
}
TreeNode* PostCreatTree(char s[])
{
stack<TreeNode*>ST;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(isoperator(s[i]))
{
if(s[i]=='~')
{
TreeNode *opnode =new TreeNode(s[i],ST.top());
ST.pop();
ST.push(opnode);
}
else
{
TreeNode *rchild=ST.top();
ST.pop();
TreeNode *lchild=ST.top();
ST.pop();
TreeNode *opnode=new TreeNode(s[i],rchild,lchild);
ST.push(opnode);
}
}
else
{
TreeNode*node=new TreeNode(s[i]);
ST.push(node);
}
}
return ST.top();
}
TreeNode*InCreateTree(char s[])
{
char posts[1000]={0};
int num=0;
int len=strlen(s);
stack<char>ST;
for(int i=0;i<len;i++)
{
char now=s[i];
if(isoperator(now)==false)
{
posts[num++]=now;
}
else if(now=='(')
{
ST.push(now);
}
else if(now==')')
{
while(ST.top()!='(')
{
posts[num++]=ST.top();
ST.pop();
}
ST.pop();
}
else if(now=='&'||now=='|'||now=='~')
{
while(!ST.empty()&&ST.top()!='('&&GetPriority(ST.top())>=GetPriority(now))
{
posts[num++]=ST.top();
ST.pop();
}
ST.push(now);
}
}
while(!ST.empty())
{
posts[num++]=ST.top();
ST.pop();
}
// cout<<posts<<endl;
return PostCreatTree(posts);
}
void Inorder(TreeNode*node)
{
if(node!=NULL)
{
Inorder(node->lchild);
cout<<node->var<<" ";
Inorder(node->rchild);
}
}
void Postorder(TreeNode*node)
{
if(node!=NULL)
{
Postorder(node->lchild);
Postorder(node->rchild);
cout<<node->var<<" ";
}
}
void Preorder(TreeNode*node)
{
if(node!=NULL)
{
cout<<node->var<<" ";
Preorder(node->lchild);
Preorder(node->rchild);
}
}
bool maplist[1000];
bool cal(bool A,char op,bool B)
{
if(op=='|')
return A|B;
else if(op=='&')
return A&B;
else if(op=='~')
return !B;
}
bool GetResult(TreeNode *p)
{
if(p)
{
if(p->rchild==NULL&&p->lchild==NULL)
{
return maplist[p->var];
}
else
{
return cal(GetResult(p->lchild),p->var,GetResult(p->rchild));
}
}
else
{
return NULL;
}
}
TreeNode*root=NULL;
char maxchar;
int flag;
bool GetTrueList;
void judge(char i)
{
if(i<maxchar)
{
maplist[i]=!maplist[i];
judge(i+1);
maplist[i]=!maplist[i];
judge(i+1);
}
else
{
if(GetTrueList)
{
for(int j='A';j<maxchar;j++)
printf("%d",maplist[j]);
printf("真值:%d",GetResult(root));
printf("\n");
}
else
if(flag!=GetResult(root))
{
flag=-1;
return;
}
}
}
int main()
{
//freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin);//PLEASE DELETE IT!!!!!!!!!!!!!!!!!!!!!!!!
char s[1000];
while(1)
{
root=NULL;
maxchar=0;
GetTrueList=false;
memset(maplist,0,sizeof(maplist));
printf("请输入逻辑表达式:");
scanf("%s",s);
for(int i=0;i<strlen(s);i++)
{
if(!isoperator(s[i]))
maxchar=max(maxchar,s[i]);
}
maxchar++;
root=InCreateTree(s);
printf("先序遍历:");
Inorder(root);
printf("\n");
printf("后序遍历:");
Postorder(root);
printf("\n");
flag=GetResult(root);//得到一个起始值,根据变化情况判断
judge('A');
if(flag==0)
{
printf("永假\n");
}
else if(flag==1)
{
printf("永真\n");
}
else
{
printf("可满足式,是否显示真值表或自定义变量?(1)打印真值表(2)自定义变量\n");
rewind(stdin);
int is;
scanf("%d", &is);
if(is==2)
{
while(is==2)
{
for(char i='A';i<maxchar;i++)
{
printf("%c=",i);
scanf("%d",&is);
maplist[i]=is;
}
if(GetResult(root)==true)
printf("当前逻辑表达式为:真\n");
else
printf("当前逻辑表达式为:假\n");
printf("输入2继续,其他退出:");
scanf("%d", &is);
}
}
else
{
GetTrueList=true;
for(int i='A';i<maxchar;i++)
printf("%c",i);
printf("\n");
judge('A');
}
}
}
return 0;
}
/*
(A&B&C)|(C&D&~(A&B))
(A|B|C)&(C|D|~C)&(~A)&(B)&A|(A&B&C)
(A&B|C)
(A&B&C&D&E)|(F&C&G&H)|I
(A|~A)
*/