树和二叉树的应用Word格式文档下载.docx
《树和二叉树的应用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《树和二叉树的应用Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
C&
~B
(5)(A|B)&
(A|~B)
(6)A&
~B|~A&
B;
输出结果
TrueForever
FalseForever
FalseForever
Statisfactible
Statisfactible
4.本程序主要分为六个模块
(1)主程序模块
voidmain()
{初始化
While{
接受命令
处理命令}
if(choice==0)退出
}
(2)对栈的操作模块。
(3)二叉树的建立模块,采用自底向上根据运算符地优先级来建立子树函数,读取逻辑表达式。
(4)逻辑运算符的优先级判别模块。
(5)重言式的识别函数模块。
(6)求值模块。
5.各个模块之间的调用关系具体如下图:
主函数模块调用:
对操作符栈和变量栈的操作模块initstack()pop()push()geittop(),逻辑运算符的优先级判别模块compa(),二叉树的建立模块creattree(),重言式的判别模块judge(),用户为变量赋值模块user(),求值模块getvalue()。
三.详细程序:
//函数头
#include<
stdio.h>
string.h>
stdlib.h>
math.h>
//函数状态码定义
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-2
#defineNULL0
typedefintStatus;
#defineinitstackmax100;
typedefstructbittree{
chardata;
bittree*left;
//左孩子指针
bittree*right;
//右孩子指针
}bittree,*bit;
//二叉树类型
structstack{
bit*base;
//在栈构造之前和销毁之后,base的值为NULL
inttop;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
};
//栈类型
//其中函数操作的伪码算法如下:
voidinitstack(stack&
s)
{//构造一个空栈s
s.base=newbit[100];
s.top=-1;
s.stacksize=initstackmax;
voidpush(stack&
s,bit&
s1)
{
//插入元素s1为新的栈顶元素
s.top++;
s.base[s.top]=s1;
}
chargettop(stack&
//用s返回栈顶元素
returns.base[s.top]->
data;
bitpop(stack&
//删除是栈顶元素,并用s返回其值
s.top--;
returns.base[s.top+1];
charcompa(chara,charb)
{
//按优先级的高低顺序输出运算符
charpri[6][7]={
'
'
|'
&
'
~'
('
)'
#'
>
<
='
//第一次进栈时进行比对
for(intl=0;
l<
6;
l++)
if(pri[l][0]==a)
break;
for(intj=0;
j<
7;
j++)
if(pri[0][j]==b)
returnpri[l][j];
bitcreattree(char*p,stack&
vari,stack&
symbol)
//构造二叉树
initstack(vari);
initstack(symbol);
bitm,n;
bitexam;
exam=newbittree;
exam->
data='
;
push(symbol,exam);
while(*p!
||(gettop(symbol)!
))//第一次生成树时,*P!
=#而(gettop()->
data=='
)以后则相反
{
if((int(*p)>
=65)&
(int(*p)<
=90))//是变量
{
data=*p;
left=NULL;
right=NULL;
push(vari,exam);
p++;
else
switch(compa(gettop(symbol),*p)){
case'
:
exam=newbittree;
exam=pop(symbol);
n=pop(vari);
left=n;
if(exam->
data!
)
m=pop(vari);
right=m;
push(vari,exam);
}//switch
}//else
}//while
bittemp=pop(symbol);
deletetemp;
returnexam;
intgetvalue(bitroot,intnum[])
//根据变量的取值组合并利用逻辑表达式的性质对树进行求值
if((root->
data>
(root->
data<
=90))
returnnum[root->
data-65];
else{
switch(root->
data){
returngetvalue(root->
left,num)||getvalue(root->
right,num);
left,num)&
getvalue(root->
return!
left,num);
voiduser(bitroot,intm,charb[])
//若用户对表达式变元取定一组值,程序就求出并显示逻辑表达式的值
inta[30];
intn;
for(intk=0;
k<
=m;
k++)
printf("
请输入n的值\n"
);
scanf("
%d"
&
n);
a[b[k]-65]=n;
if(getvalue(root,a))
True"
False"
voidjudge(bitroot,charbo[],intnu)
//重言式的判别
intsample[30];
charbl[20],t;
intm=0,lzq,value,count=0,tu=0,fa=0,sat=0;
nu;
if(bo[k]>
=65&
bo[k]<
=90)
intmark=0;
m;
if(bl[j]==bo[k]){
mark=1;
break;
if(mark==0){
bl[m]=bo[k];
m++;
}
intnumall=(int)pow(2,m);
m--;
for(inti=0;
i<
numall;
i++)
{lzq=m;
m+1;
sample[bl[lzq]-65]=(i>
j)%2;
lzq--;
value=getvalue(root,sample);
if(value)
tu++;
if(fa>
0){
satisfactible"
sat=1;
if(tu==numall){
Tureforever\n"
{fa++;
if(tu>
satisfactible\n"
sat=1;
else{
if(fa==numall)
printf("
Falseforever\n"
if(sat==1){
请给变量赋值,c代表继续,e代表停止"
%c"
t);
while(t){
if(t=='
c'
for(i=0;
bl[i]);
user(root,m,bl);
//3.主函数
intmain(intargc,char*argv[])
charstr[300],str1[100],*p;
intn,len=0,j;
intk=0,m,count=0;
stackvari,symbol;
bitroot;
printf("
请输入0或1,0--终止程序1--继续程序\n"
scanf("
m);
while(m)
count++;
if(m==1)
if(count>
1)delete[]vari.base;
k=0;
请输入表达式(变量以大写形式输入)"
gets(str);
len=strlen(str);
for(j=0;
len;
if(str[j]!
)
str1[k]=str[j];
k++;
str1[k]='
len=strlen(str1);
p=str1;
root=creattree(p,vari,symbol);
judge(root,str1,len);
return0;
问题及解决方法:
1.开始时,将栈中元素作为二叉树的结点结构很是复杂,建立二叉树后,只需按照遍历逐个进行判断即可顺利实现重言式的判别。
2.模块设计包括结构体模块,操作算法模块和主函数模块,操作算法模块主要包括了栈和树的函数。
3.本程序先使用栈将逻辑表达式的变量进行存储,然后将栈中的元素作为二叉树的结点结构,然后根据优先级读取表达式建立二叉树,并通过逐个判断根实现对重言式的判别,实现时调试顺利。