布尔表达式内部鹅腿悬赏查错
来源:互联网 发布: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;}
阅读全文
0 0
- 布尔表达式内部鹅腿悬赏查错
- 布尔表达式
- 布尔表达式
- 布尔表达式判别程序
- Ruby系列:布尔表达式
- Java if(布尔表达式)
- 布尔表达式解题报告
- 布尔表达式的验证
- 布尔表达式问题
- 判断布尔表达式
- 布尔(Boolean)表达式
- C++编写布尔表达式
- Python复合布尔表达式
- 3515 翻译布尔表达式
- 翻译布尔表达式
- 翻译布尔表达式
- sdut 翻译布尔表达式
- 查错
- 【大数据】开发环境搭建(四):各组件搭建步骤
- PHP中的单例模式
- linux 之 实时监控脚本
- spring-cloud 注册中心eureka环境搭建
- Mybatis中javaType和jdbcType对应关系
- 布尔表达式内部鹅腿悬赏查错
- 博客开通啦
- java序列化和反序列化
- Appium测试项目运行是报错“java.lang.NoClassDefFoundError: com/google/common/base/Function”
- 解决Apache+PHP服务器提示HTTP 500问题
- 洛谷 P1456 Monkey King 题解
- JAVA | 41
- java 对象存储
- GitHub 上 window版本的Redis-x64-3.2.100.zip 下载没网速 以及安装