计算逻辑表达式

计算逻辑表达式的值(优先级顺序:()>!>&&>||

输入描述

请输入逻辑表达式,表达式由以下字符组成:TF&&||!()

T:表示布尔的true
F:表示布尔的false

输出描述

返回逻辑表达式的结果,油校的结果包括TFE
T:表示逻辑表达式的结果为true
F:表示逻辑表达式的结果为false
E:表示逻辑表达式不正确,不能计算出结果

样例输入

1
2
3
T || F && F || F  
! F || T && T
T && F

样例输出

1
2
3
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;
}

Comments

2020-11-17

⬆︎TOP