判断重言式中的问题
判断输入的式子是永真式还是永假式还是可表达式,用树和栈来解答代码有点长
想问的是为什么Fuzhi这个函数里面tof[0]=T->value;和tof[i]=T->value;这两条语句总是有错,运行的时候程序会停止工作
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct BiTNode{
char data;
int value;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
void InitStack(SqStack &S){//建立栈
S.base=(BiTree *)malloc(STACK_INIT_SIZE * sizeof(BiTree));
if(!S.base) exit(-2);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void Push(SqStack &S,BiTree e){ // 插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){ // 栈满,追加存储空间
S.base=(BiTree *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
if(!S.base) exit(OVERFLOW); // 存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)++=e;
}
void Pop(SqStack &S,BiTree &e){//弹出栈顶,并得到栈顶值
e=*--S.top;
}
int StackEmpty(SqStack s){
if(s.base==s.top)
return 0;
else
return 1;
}
BiTree GetTop(SqStack &S){//得到栈顶元素
return *(S.top-1);
}
void InitBiTree(BiTree &T){ //构造空二叉树T
T=NULL;
}
char compare(char a,char b){//比较优先级
char c;
switch(a){
case '|':{
if(b=='|') c='>';
if(b=='&') c='<';
if(b=='~') c='<';
if(b=='(') c='<';
if(b==')') c='>';
if(b=='#') c='>';
}break;
case '&':{
if(b=='|') c='>';
if(b=='&') c='>';
if(b=='~') c='<';
if(b=='(') c='<';
if(b==')') c='>';
if(b=='#') c='>';
}break;
case '~':{
if(b=='|') c='>';
if(b=='&') c='>';
if(b=='~') c='>';
if(b=='(') c='<';
if(b==')') c='>';
if(b=='#') c='>';
}break;
case '(':{
if(b=='|') c='<';
if(b=='&') c='<';
if(b=='~') c='<';
if(b=='(') c='<';
if(b==')') c='=';
if(b=='#') c='>';
}break;
case ')':{
if(b=='|') c='>';
if(b=='&') c='>';
if(b=='~') c='>';
if(b=='(') c='>';
if(b==')') c='>';
if(b=='#') c='>';
}break;
case '#':{
if(b=='|') c='<';
if(b=='&') c='<';
if(b=='~') c='<';
if(b=='(') c='<';
if(b==')') c='<';
if(b=='#') c='=';
}break;
}
return c;
}
void CreatBiTree(BiTree &T,char a[]){ // 建树
SqStack OPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
int i=0,length=0;
char c,comvalue,c1;
BiTree b,b1,a1,a2,a3;
b=(BiTree)malloc(sizeof(BiTNode));
b->data='#';
Push(OPTR,b);
while(a[i]) {length++;i++;}
i=0;
c=a[0];
while(c!='#'||GetTop(OPTR)->data!='#'){
c=a[i];
if(c==' ') { i++;continue; }
if(i>=length) break;
b1=(BiTree)malloc(sizeof(BiTNode));
b1->data=c;
b1->lchild=NULL;
b1->rchild=NULL;
if(c>='A'&&c<='Z'){
Push(OPND,b1);
i++;
}
else{
comvalue=compare(GetTop(OPTR)->data,c);
switch(comvalue){
case'<':b1=(BiTree)malloc(sizeof(BiTNode));
b1->data=a[i];
b1->lchild=NULL;
b1->rchild=NULL;
Push(OPTR,b1);
i++;
break;
case'=':Pop(OPTR,b1);
i++;
break;
case'>':Pop(OPTR,a1);
Pop(OPND,a2);
a1->rchild=a2;
if(a1->data!='~'){
Pop(OPND,a2);
a1->lchild=a2;
}
Push(OPND,a1);
break;
}
}
}
}
void caculate(BiTree &T){
if(T){
caculate(T->lchild);
caculate(T->rchild);
switch(T->data){
case '~':T->value=!T->rchild->value;break;
case '&':T->value=T->lchild->value&&T->rchild->value;break;
case '|':T->value=T->lchild->value||T->rchild->value;break;
}
}
}
int variable(char a[],char (&bianliang)[101]){//计算变量的数量
int i=0,m=0,j=0;
char x[101],lable='A';
while(a[i]){
if(a[i]>='A'&&a[i]<='Z'){
x[m]=a[i];
m++;
}
i++;
}
i=0;
while(x[j]){
if(x[j]==lable){
bianliang[i]=lable;
lable++;
i++;
}
j++;
}
return i;
}
void Number(BiTree &T,char var,int val){
if(T){
if(T->data==var)
T->value=val;
else
T->value=0;
Number(T->lchild,var,val);
Number(T->rchild,var,val);
}
}
void Fuzhi(BiTree &T,char bianliang[],int sum,int total){
int i,k=0,zz;
int tof[101];
char a1[101];
for(i=0;i<total;i++){
tof[i]=0;
}
for(i=0;i<sum;i++){
Number(T,bianliang[i],0);
}
caculate(T);
tof[0]=T->value;
for(i=1;i<total;i++){
itoa(i,a1,2);
for(k=0;k<sum;k++){
Number(T,bianliang[k],(int)a1[k]);
}
caculate(T);
tof[i]=T->value;
}
for(i=0;i<total;i++){
zz+=tof[i];
}
if(zz==0) printf("FLASE\n");
else if(zz==i) printf("TRUE\n");
else printf("kepanbie\n");
}
int main(){
BiTree T;
InitBiTree(T);
char a[101],bianliang[101];
int sum,total,tof[101],b1[101];
printf("shurushuju:\n");
scanf("%s",&a);
CreatBiTree(T,a);
sum=variable(a,bianliang);
total=pow(2,sum);
Fuzhi(T,bianliang,sum,total);
return 0;
}