【数据结构】表达式树


#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,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)
*/

相关文章

键树的基本概念 键树又称数字查找树(Digital Search Tree)。 它是一棵度大于等于2的树,树中的每个结...
[TOC] 基本概念 数据: 数据 是对客观事物的符号表示,在计算机科学中指所有能输入到计算机中并被计算机...
[TOC] 反证法 基本概念: 一般地,假设原命题不成立(即 在原命题的条件下,结论不成立),经过正确的推...
最近抽空整理了&quot;数据结构和算法&quot;的相关文章。在整理过程中,对于每种数据结构和算法...
[TOC] 矩阵在计算机图形学、工程计算中占有举足轻重的地位。在数据结构中考虑的是如何用最小的内存空间...
[TOC] 大O表示法:算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或...