资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
重言式的判别题目:一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一程序,通过真值表判别一个逻辑表达式属于上述哪一类。一、需求分析1、逻辑表达式从终端输入,长度不超过一行。2、逻辑运算符包括“|”“&”“”表示或 与 非。运算符优先程度递增,但是可由括号改变。3、逻辑变元为大写字母表达式中任何地方都可以含有多个空格符。4、运用自底向上的算符优先法5、重言式显示“true forever”;矛盾式显示“false forever”;否则显示“satisfactible”。二、概要设计为实现上述需求需要用到自底向上的算符优先法,和自顶向下分割,先序遍历建立二叉树的方法。自底向上的算符优先法:char OPTRCHART77= ,|,&,(,),#, |, &, ,(,),#,data,*p)case :break;/*switch*/建立二叉树:typedef struct BiTNodestruct BiTNode * Lchild;struct BiTNode * Rchild;ElemType data;BiTNode , *BiTree;栈中的操作:typedef struct NodeBiTree * base;BiTree *top;int stacksize;SqStack;入栈操作及出栈销毁栈的操作:int InitStack(SqStack * stack)stack-base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base;stack-stacksize=STACK_INIT_SIZE;return OK;BiTree GetTop(SqStack * stack)if(stack-top=stack-base)return NULL;return *(stack-top-1);int Push(SqStack * stack,BiTree Bitnode)if(stack-top-stack-base=stack-stacksize)stack-base=(BiTree*)realloc(stack-base,(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base+stack-stacksize;stack-stacksize+=STACKINCREAMENT;*(stack-top)=Bitnode;stack-top+;return OK;BiTree Pop(SqStack * stack)if(stack-top=stack-base)return ERROR;return *(-stack-top);int DestroyStack (SqStack * stack)free(stack-base);return OK;三、详细设计详细程序如下:#include#include#include#include#define OK 1#define ERROR 0#define VARIMAXNUM 20 #define STARMAXLEN 100 #define STACK_INIT_SIZE 100 /栈的最大长度#define STACKINCREAMENT 10 /每次增加的栈的长度#define ElemType char 将elemtype定义为char型typedef struct BiTNode /创建树节点 按照书上原样创建struct BiTNode * Lchild;struct BiTNode * Rchild;ElemType data; /字符型BiTNode , *BiTree;typedef struct Node /栈BiTree * base;BiTree *top;int stacksize;SqStack;char OPTRCHART77= /此举是为了后面的优先级考虑 ,|,&,(,),#,|,&,(,),#,base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base;stack-stacksize=STACK_INIT_SIZE;return OK;BiTree GetTop(SqStack * stack) /返回值为BiTree类型的 取栈头if(stack-top=stack-base)return NULL;return *(stack-top-1);int Push(SqStack * stack,BiTree Bitnode) /将树的节点放进栈的操作,入栈if(stack-top-stack-base=stack-stacksize)stack-base=(BiTree*)realloc(stack-base,(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base+stack-stacksize;stack-stacksize+=STACKINCREAMENT;*(stack-top)=Bitnode;stack-top+;return OK;BiTree Pop(SqStack * stack) /取值指针后移if(stack-top=stack-base)return ERROR;return *(-stack-top);int DestroyStack (SqStack * stack) /毁栈 free(stack-base);return OK;char strSTARMAXLEN;int varitabVARIMAXNUM+1;int sum;BiTree root;SqStack OPTR,OPND;char cmp(char a,char b) /取左右交叉的符号即“”“=”int i,j;for(i=0;i=6;i+)if(OPTRCHARTi0=a)break;for(j=0;jdata=#;Push(&OPTR,temp);while(*p!=#)|(GetTop(&OPTR)-data!=#)if(*p=65)&(*p=97)&(*pdata=*p;temp-Lchild=NULL;temp-Rchild=NULL;Push(&OPND,temp);p+;elseswitch(cmp(GetTop(&OPTR)-data,*p) /开始判断优先级case data=*p;temp-Lchild=NULL;temp-Rchild=NULL;Push(&OPTR,temp); p+;break;case =:temp=Pop(&OPTR);free(temp);p+;break;case :temp=Pop(&OPTR);b=Pop(&OPND);temp-Rchild=b;if(temp-data!=)a=Pop(&OPND);temp-Lchild=a;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号