布尔表达式内部鹅腿悬赏查错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csdnicewing/article/details/78693456

输入一个布尔表达式,请你输出它的真假值。
比如:( V | V ) & F & ( F | V )
V表示true,F表示false,&表示与,|表示或,!表示非。
上式的结果是F

~~~~~~~~~~~~~~~~~~~~~~~~~  我是华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题:与 和 或 的优先级,抛开C语言本身,真正的逻辑代数(因为我没学过)有没有要考虑 或 和 与 优先级的式子?如果有的话,优先级如何?

我的优先级体现在Rank() 函数之中

现在贴优先级不同(与 高于 或)的代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<iostream>
using namespace std;
char str[1100];
int l;
char rub;
stack <bool> num;
stack <char> opr;


int Rank(char op){
	if(op=='!') return 2;
	else if(op=='&') return 1;
	else if(op=='|') return 0;
	else return -1;
}


bool operate(bool a1,bool a2,char op){
	if(op=='&') return a1&&a2;
	else if(op=='|') return a1||a2;
	else if(op=='!') return !a1;
}


bool trans(char temp){
	if(temp=='V') return true;
	else return false;
}


void init(){
	//printf("mark");
	int tl=strlen(str);
	l=0;
	for(int i=0;i<tl;i++){
		if(str[i]!=' '){
			str[l]=str[i];
			l++;
		}
	}
	str[l]='\0';
}


void cal(){
	int pos=0;
	while(pos<l){
		if(str[pos]=='(') opr.push('(');
		else if(str[pos]==')'){
			while(opr.top()!='('){
				char op=opr.top();
				opr.pop();
				if(op=='!'){
					bool num0=num.top();
					num.pop();
					num0=operate(num0,true,op);
					num.push(num0);
				}else{
					bool num1=num.top();num.pop();
					bool num2=num.top();num.pop();
					bool num0=operate(num1,num2,op);
					num.push(num0);
				}
			}
			opr.pop();
		}else if(str[pos]=='F'||str[pos]=='V'){
			num.push(trans(str[pos]));
		}
		else if(str[pos]=='!'){
			if(opr.empty()) opr.push('!');
			else if(opr.top()!='!') opr.push('!');
			else if(opr.top()=='!') opr.pop();
		}else{
			if(!opr.empty()){
				while(!opr.empty()&&Rank(opr.top())>=Rank(str[pos])){
					if(opr.top()=='!'){
						char op=opr.top(); opr.pop();
						bool num0=num.top(); num.pop();
						num.push(operate(num0,true,op));
					}else{
						char op=opr.top();opr.pop();
						bool num1=num.top();num.pop();
						bool num2=num.top();num.pop();
						num.push(operate(num1,num2,op));
					}
				}
				
			}
			opr.push(str[pos]);
		}
		pos++;
	}
	while(!opr.empty()){
		char op=opr.top();
		opr.pop();
		if(op=='!'){
			bool num0=num.top();num.pop();
			num.push(operate(num0,true,op));
		}else{
			bool num1=num.top();num.pop();
			bool num2=num.top();num.pop();
			num.push(operate(num1,num2,op));
		}
	}
	if(num.top()) printf("V\n");
	else printf("F\n");
}


int main(){
	
	while(scanf("%[^\n]s",str)!=EOF){
		scanf("%c",&rub);
		while(!num.empty()) num.pop();
		while(!opr.empty()) opr.pop();
		init();
		cal();
	}
	return 0;
}

再贴优先级相同(与 等于 或)的代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<iostream>
using namespace std;
char str[1100];
int l;
char rub;
stack <bool> num;
stack <char> opr;


int Rank(char op){
	if(op=='!') return 2;
	else if(op=='&') return 1;
	else if(op=='|') return 1;
	else return -1;
}


bool operate(bool a1,bool a2,char op){
	if(op=='&') return a1&&a2;
	else if(op=='|') return a1||a2;
	else if(op=='!') return !a1;
}


bool trans(char temp){
	if(temp=='V') return true;
	else return false;
}


void init(){
	//printf("mark");
	int tl=strlen(str);
	l=0;
	for(int i=0;i<tl;i++){
		if(str[i]!=' '){
			str[l]=str[i];
			l++;
		}
	}
	str[l]='\0';
}


void cal(){
	int pos=0;
	while(pos<l){
		if(str[pos]=='(') opr.push('(');
		else if(str[pos]==')'){
			while(opr.top()!='('){
				char op=opr.top();
				opr.pop();
				if(op=='!'){
					bool num0=num.top();
					num.pop();
					num0=operate(num0,true,op);
					num.push(num0);
				}else{
					bool num1=num.top();num.pop();
					bool num2=num.top();num.pop();
					bool num0=operate(num1,num2,op);
					num.push(num0);
				}
			}
			opr.pop();
		}else if(str[pos]=='F'||str[pos]=='V'){
			num.push(trans(str[pos]));
		}
		else if(str[pos]=='!'){
			if(opr.empty()) opr.push('!');
			else if(opr.top()!='!') opr.push('!');
			else if(opr.top()=='!') opr.pop();
		}else{
			if(!opr.empty()){
				while(!opr.empty()&&Rank(opr.top())>=Rank(str[pos])){
					if(opr.top()=='!'){
						char op=opr.top(); opr.pop();
						bool num0=num.top(); num.pop();
						num.push(operate(num0,true,op));
					}else{
						char op=opr.top();opr.pop();
						bool num1=num.top();num.pop();
						bool num2=num.top();num.pop();
						num.push(operate(num1,num2,op));
					}
				}

			}
			opr.push(str[pos]);
		}
		pos++;
	}
	while(!opr.empty()){
		char op=opr.top();
		opr.pop();
		if(op=='!'){
			bool num0=num.top();num.pop();
			num.push(operate(num0,true,op));
		}else{
			bool num1=num.top();num.pop();
			bool num2=num.top();num.pop();
			num.push(operate(num1,num2,op));
		}
	}
	if(num.top()) printf("V\n");
	else printf("F\n");
}


int main(){
	
	while(scanf("%[^\n]s",str)!=EOF){
		scanf("%c",&rub);
		while(!num.empty()) num.pop();
		while(!opr.empty()) opr.pop();
		init();
		cal();
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/csdnicewing/article/details/78693456