计算命题演算公式的真值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四计算命题演算公式的真值

一.实验题目

所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE)和逻辑运算符∧(AND)、∨(OR)和┐(NOT)按一定规则所组成的公式(蕴含之类的运算可以用∧、∨和┐来表示)。公式运算的先后顺序为┐、∧、∨,而括号()可以改变优先次序。已知一个命题演算公式及各变量的值,要求设计一个程序来计算公式的真值。

要求:

(1)利用二叉树来计算公式的真值。首先利用堆栈将中缀形式的公式变为后缀形式;然后根据后缀形式,从叶结点开始构造相应的二叉树;最后按后序遍历该树,求各子树之值,即每到达一个结点,其子树之值已经计算出来,当到达根结点时,求得的值就是公式之真值。

(2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。

(3)根据用户的要求显示表达式的真值表。

二.实验设计

1. 设计思想

(1)数据结构设计

a 建立一个链式堆栈,实现括号的匹配问题。

b建立一个顺序堆栈,来实现中缀转后缀并实现二叉树的打印。

(2)算法设计

a.括号匹配 b中缀转后缀 c打印二叉树和真值表

2. 设计表示

自定义和调用的函数如下所示:

#include""

#include""

#include<>

#include<>

#include<>

#include<>

#include<>

函数说明如下

SeqStack1; /*定义一个堆栈SeqStack1*/

void StackInitiate1(SeqStack1 *S) /*初始化堆栈1,栈底为‘#’*/

void StackPush1(SeqStack1 *S,DataType x) /*将元素压入堆栈1*/

void StackPop1(SeqStack1 *S,DataType *x) /*弹出堆栈1的栈顶元素*/

int StackTop1(SeqStack1 S,DataType *d) /*取堆栈1的栈顶元素*/

SeqStack2; /*定义一个顺序堆栈SeqStack2*/

void StackInitiate2(SeqStack2 *S) /*初始化堆栈2*/

BiTreeNode * StackPop2(SeqStack2 *S) /*从堆栈2中弹出栈顶元素*/

BiTreeNode; /*定义二叉树的结点*/

void Initiate(BiTreeNode **root) /*初始化树的根结点*/

void print(BiTreeNode *bt,int n) /*逆时针打印二叉树*/

void StackPush2(SeqStack2 *S,BiTreeNode *x) /*将二叉树结点压入堆栈2*/

int Convert(char a[500],char b[500][100],SeqStack1 *S,int n) /*将待求表达式转换为后缀形式*/

BiTreeNode * BuildTree(char b[500][100],int n)/*根据表达式的后缀形式,构造相应的二叉树*/

LSNode; /*定义了链式堆栈用于下面检测表达式的括号匹配*/ void StackInitiate(LSNode** head) /*初始化堆栈*/

int StackNotEmpty(LSNode* head) /*检测堆栈是否为空的函数*/

int StackPush(LSNode* head,DataType x) /*将元素入栈*/

int StackPop(LSNode* head,DataType* d) /*弹出栈顶元素*/

int StackTop(LSNode* head,DataType *d) /*取栈顶元素*/

void Destroy(LSNode* head) /*撤消*/

void ExplsCorrect(char exp[]) /*检测输入表达式的括号匹配函数*/

i

3.详细设计

void StackInitiate(LSNode** head)

{

if((*head=(LSNode*)malloc(sizeof(LSNode)))==NULL)exit(1);

(*head)->next=NULL;

} /*初始化堆栈*/

int StackNotEmpty(LSNode* head)

{

if(head->next==NULL)return 0;

else return 1;

}

/*检测堆栈是否为空的函数,若为空,返回0,否则返回1*/

typedef struct snode

{

DataType data;

struct snode* next;

}LSNode;

/*定义了链表的结点用于下面检测表达式的括号匹配*/

int StackPop(LSNode* head,DataType* d)

{

LSNode* p=head->next;

if(p==NULL)

{

cout<<"堆栈已空出错"<

return 0;

}

head->next=p->next;

*d=p->data;

free(p);

return 1;

}

/*弹出栈顶元素*/

int StackPush(LSNode* head,DataType x)

{

LSNode* p;

if((p=(LSNode*)malloc(sizeof(LSNode)))==NULL) {

cout<<"内存空间不足无法插入!"<

return 0;

}

p->data=x;

p->next=head->next;

head->next=p;

return 1;

}

/*将元素入栈*/

int StackTop(LSNode* head,DataType *d)

{

LSNode* p=head->next;

if(p==NULL)

{

cout<<"堆栈已空出错"<

return 0;

}

*d=p->data;

return 1;

}

/*取栈顶元素*/

相关文档
最新文档