计算命题演算公式的真值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;