布林表示式內部鵝腿懸賞查錯
阿新 • • 發佈:2018-11-25
輸入一個布林表示式,請你輸出它的真假值。
比如:( 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; }