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

来源:互联网 发布:java源码下载 编辑:程序博客网 时间:2024/05/01 23:03

输入一个布尔表达式,请你输出它的真假值。
比如:( 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;}


原创粉丝点击