这学期上离散数学实验课,遇到了两个有意思的题目
第一个是输入表达式例如p&q,求出这个表达式的真值表,进而求出它的主合取范式和主析取范式。
其实后面的很无聊,有意思的是根据表达是生成真值表,这就类似于给你一个数学表达式(a+b)/(c*d),然后根据a b c d 的不同取值求出表达式的结果,这里解析这个表达式是一个重点,还要考虑括号的优先级问题,如果你想到把中缀表达式换成后缀表达式,那么好吧,你已经大概知道这个程序的主要结构了~
#include <iostream>
#include <cmath>
#include<stack>
#include<deque>
#include<string>
#include<map>
using namespace std;
const int M = 10; //真值表最大列数
const int N = 520; //真值表最大行数
class Expression {
private:
string coll1; //中缀表达式
stack<char> coll2; //操作符
deque<char> coll3; //后缀表达式
stack<int> coll4; //辅助计算后缀表达式
//获得条件表达式的值
int getValueSingle(int a, int b){
if (a == 1 && b == 0)
return 0;
else
return 1;
}
//获得双条件表达式的值
int getValueDouble(int a, int b){
if ((a == 1 && b == 1) || (a == 0 && b == 0))
return 1;
else
return 0;
}
//获得符号的优先性
int getPri(char c) {
switch(c) {
case '!':
return 4;
break;
case '&':
return 3;
break;
case '|':
return 2;
break;
case '-':
return 1;
break;
case '=':
return 0;
break;
case '(':
case ')':
return -1;
break;
}
}
//处理符号
void check(char c) {
if(coll2.empty()) {
coll2.push(c);
return;
}
if(c == '(' || c == ')') {
if(c=='(')
coll2.push(c);
else {
while(coll2.top()!='(') { //弹出所有元素直到遇到左括号
char ch = coll2.top();
coll3.push_back(ch);
coll2.pop();
}
coll2.pop();
}
}
else {
char sym = coll2.top();
if(getPri(c)<=getPri(sym)) {
coll2.pop();
coll3.push_back(sym);
check(c);
}
else {
coll2.push(c);
}
}
}
//从coll中取出元素,分配元素到coll2和coll3中
void allocate() {
for (int i=0; i<coll1.size(); i++) {
char c = coll1[i];
if('A'<c && 'Z'>c) {
coll3.push_back