计算逻辑表达式
计算逻辑表达式的值(优先级顺序:()
>!
>&&
>||
)
输入描述
请输入逻辑表达式,表达式由以下字符组成:T
、F
、&&
、||
、!
、(
、)
、
。
T
:表示布尔的true
F
:表示布尔的false
输出描述
返回逻辑表达式的结果,油校的结果包括T
、F
、E
T
:表示逻辑表达式的结果为true
F
:表示逻辑表达式的结果为false
E
:表示逻辑表达式不正确,不能计算出结果
样例输入
1 2 3
| T || F && F || F ! F || T && T T && F
|
样例输出
HINT
![upload successful](/images/pasted-0.png
代码
未测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| #include<bits/stdc++.h> using namespace std;
string dealNull( string &str ){ int finder; while( true ){ finder = str.find(" "); if( finder == -1 ){ break; } str.erase( finder, 1 ); } return str; }
string deal( string &str ){ int isError = 0; int finder;
int lk = str.find("("); int rk =str.rfind(")"); if( (lk!=-1) xor (rk!=-1) ){ return "E"; } else if( (lk!=-1) ) { str = str.replace( lk, rk-lk+1, deal(((string)"").assign(str,lk+1,rk-lk-1)) ); }
while( true ){ finder = str.find("!"); if( finder == -1 ){ break; } else { switch( str[finder+1] ){ case 'T': str[finder+1] = 'F'; break; case 'F': str[finder+1] = 'T'; break; case '!': str.erase( finder+1, 1 ); break; default: isError = 1; } str.erase( finder, 1 ); if( isError ) return "E"; } }
while( true ){ finder = str.find("&&"); if( finder == -1 ){ break; } else if( finder<0 || finder==(int)str.length()-1 ) { isError = 1; break; } else { if( str[finder-1] == 'T' && str[finder+2] == 'T' ){ str[finder-1] = 'T'; } else if( (str[finder-1]=='F'||str[finder-1]=='T') && (str[finder+2]=='T'||str[finder+2]=='F') ){ str[finder-1] = 'F'; } else { isError = 1; } } str.erase( finder, 3 ); if( isError ) return "E"; } while( true ){ finder = str.find("||"); if( finder == -1 ){ break; } else if( finder<0 || finder==(int)str.length()-1 ) { isError = 1; break; } else { if( (str[finder-1]=='T'||str[finder-1]=='F') && (str[finder+2]!='T'||str[finder+2]!='F') ){ if( (str[finder-1]=='T'&&str[finder+2]=='F') || (str[finder-1]=='F' && str[finder+2]=='T') || (str[finder-1]=='T' && str[finder+2]=='T') ){ str[finder-1] = 'T'; } else { str[finder-1] = 'F'; } } else { isError = 1; } } str.erase( finder, 3 ); if( isError ) return "E"; } if( isError ){ return "E"; } return str; }
string dealString( string &str ){ str = dealNull( str ); str = deal( str ); return str=="E"||str=="F"||str=="T"?str:"E"; }
int main(){ string str; getline( cin, str ); string sb = dealString(str); cout<<sb<<endl; }
|