重言式判别 重言式判别源码及课程设计 c语言版
重言式的判别 题目:
一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一程序,通过真值表判别一个逻辑表达式属于上述哪一类。
一、需求分析
1、逻辑表达式从终端输入,长度不超过一行。 2、逻辑运算符包括“|”“&”“~”表示或 与 非。运算符优先程度递增,但是可由括号改变。
3、逻辑变元为大写字母表达式中任何地方都可以含有多个空格符。
4、运用自底向上的算符优先法 5、重言式显示“true forever”;矛盾式显示“false forever”; 否则显示“satisfactible”。
二、概要设计
为实现上述需求需要用到自底向上的算符优先法,和自顶向下分割,先序遍历建立二叉树的方法。 自底向上的算符优先法:
{
char OPTRCHART[7][7]= ' ','|','&','~','(',')','#', '|','>','','>',
'&','>','>','','>',
'~','>','>','>','','>',
'(','',
')','>','>','>','>','>','>',
'#','
};
switch(cmp(GetTop(&OPTR)->data,*p)) {
case '': break; }/*switch*/ 建立二叉树: typedef struct BiTNode { struct BiTNode * Lchild; struct BiTNode * Rchild; ElemType data; }BiTNode , *BiTree;
栈中的操作:
typedef struct Node
{
BiTree * 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<