离散数学实验课中有趣的题目

这学期上离散数学实验课,遇到了两个有意思的题目

        第一个是输入表达式例如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
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值