1. 实验要求:
求解布尔表达式
目的:本课程设计是求中缀算术表达式真值问题。求中缀算术表达式值的问
题是数据结构中栈的一个典型应用。通过本题,学生应掌握中缀表达式和后缀表
达式的转换方法和后缀表达式求值问题。
要求:已知某种类型的布尔表达式由“V”、“F”、“!”、“&”和“|”
组成,其中,“V”代表真值 True,“F”代表真值 False,“!”代表逻辑非运
算,“&”代表逻辑与运算,“|”表示逻辑或运算。并且,运算符“!”、“&”
和“|”的优先级为:“!”最高,“|”最低,“&”介于“!”和“|”之间。
你的任务是,计算给定布尔表达式的真值。
例如,布尔表达式“(V|V)&F&(F|V)”的真值为“F”.
2.实验设计
在实验设计的过程中,主要包括两个功能,分别是中缀表达式转
后缀表达式和后缀表达式求真值两个函数,在此过程中需要使用到两
个类,这两个类仅仅是数据类型不同,其他的包括函数功能等方面均
相同,所以考虑使用类模版 template;在后缀表达式的存储问题上,
并不需要太多的功能,所以就选择使用 char 型数组进行存储。
1.使用类模版 Stack,在中缀转后缀的运算中,定义 czf,用以存
放逻辑运算符;在计算真值的函数中,定义 ss,用以存放字符;
2.在中缀转后缀的函数中定义 post 数组,存放得到的后缀表达
式。
主函数
1.首先输入字符串
2.分别调用中缀转后缀函数,
3.后缀表达式真值计算函数。
布尔表达式中缀转后缀函数 chpost
1.建立栈 czf 用来存储逻辑运算符,
2.建立 post 数组用来存放后缀表达式
后缀表达式真值计算函数 yunsuan
1.建立栈 ss 用来存储字符 V
F 以及运算结果
F 时,直接将它们放到 post 数组
1.当遇到 V
中。
2.当依次遍历到‘(’、‘!’、‘|’、‘&’、‘)’采
用不同的处理方法,最终得到后缀表达式
中缀转后缀表达式函数 chpost
成员
Inorder[]
栈 czf
Post[]
1.在遍历后缀表达式的过程中,遇到不同的字
符,采用不同的解决方法
功能
存储输入的字符串
用以暂时存放运算符
用来存储结果
后缀表达式求真值 yunsuan
成员
栈 ss
post
功能
用来暂时存放 V
运算结果
沿用上一个函数的结果-后缀表达
式
F 以及每一步的
3.用户手册:
1.程序运行时,首先会看到提示:“请输入布尔表达式(中缀表达
式,以#结束)”;
2.输入布尔表达式之后,敲击回车会得到:“转换后,后缀表达式
为:*****************”;
以及“该式真值为:*”;
3.此时程序结束;
4.调试及测试:
运行结果:
1.
2.
3.
5.完善:
基本上已完成实验要求的功能,进行拓展的话,可以进行一些统
计功能。比如下面的两个功能:
1.统计输入的括号的总数: 可以在程序的第一个函数——中缀
转后缀表达式中添加一些代码,添加统计输入的括号的个数。
2.统计进行运算的次数: 能在第二个函数——后缀表达式函数
中添加统计进行运算的次数的功能。
6.源代码
#include
#include
using namespace std;
template//T 是数据类型
class Stack{
//定义类模版
public:
Stack(){ Top = 0; }
T top(){ return a[Top]; }
void pop(){ Top--; }
bool isempty(){
if (Top == 0)return true;
else
return false;
}
void push(T b)
{
}
Top++;
a[Top] = b;
private:
T a[100]; int Top;
};
void chpost(char inorder[], char post[], int &m)
{
int n = strlen(inorder);
Stackczf;
for (int i = 0; i < n; i++)
{
if ((inorder[i]=='V')||(inorder[i]=='F'))
{
}
post[m] = inorder[i];
m++;
if (inorder[i] == '(')czf.push(inorder[i]);
if (inorder[i] == '!')czf.push(inorder[i]);
if (inorder[i] == '&')
{
}
if (!czf.isempty() && (czf.top() == '!'))
{
}
post[m++] = czf.top();
czf.pop();
czf.push(inorder[i]);
else{ czf.push(inorder[i]); }
if (inorder[i] == '|')//
{
}
if (!czf.isempty() && czf.top() == '!' || czf.top() == '&')
{
}
post[m++] = czf.top();
czf.pop();
czf.push(inorder[i]);
else
czf.push(inorder[i]);
{
}
if (inorder[i] == ')')
{
while (czf.top() != '(')
post[m++] = czf.top();
czf.pop();
{
}
czf.pop();
}
}
while (!czf.isempty())
{
}
post[m++] = czf.top();
czf.pop();
}
//计算真值
char yunsuan(char post[],int n)
{
Stack
ss;
char a,b,c,result;
for(int i=0;iss.push(c);
}
if(post[i]=='&')
{
}
b=ss.top();
ss.pop();
a=ss.top();
ss.pop();
if((a=='V')&&(b=='V'))
c='V';
else c='F';
ss.push(c);
if(post[i]=='!')
{
b=ss.top();
ss.pop();
if(b=='V')
{
}
b='F';
ss.push(b);
else if(b=='F')
{
b='V';