| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1850 人关注过本帖
标题:判断重言式中的问题
只看楼主 加入收藏
s956133092ms
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-14
结帖率:100%
收藏
 问题点数:0 回复次数:0 
判断重言式中的问题
判断输入的式子是永真式还是永假式还是可表达式,用树和栈来解答

代码有点长
想问的是为什么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;
}


搜索更多相关主题的帖子: include 表达式 
2016-12-16 17:21
快速回复:判断重言式中的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015489 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved