版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}