代码
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
char s[1005];
stack<bool> B;
stack<char> C;
int main() {
while (cin.getline(s, 1000, '\n')) {
int len = strlen(s);
while (!B.empty())
B.pop();
while (!C.empty())
C.pop();
for (int i = 0; i < len; ++i) {
if (s[i] == ' ')
continue;
if (s[i] == 'V') {
bool tmp = true;
while (!C.empty() && C.top() == '!') {
C.pop();
tmp = !tmp;
}
B.push(tmp);
} else if (s[i] == 'F') {
bool tmp = false;
while (!C.empty() && C.top() == '!') {
C.pop();
tmp = !tmp;
}
B.push(tmp);
} else if (s[i] == '(' || s[i] == '!') {
C.push(s[i]);
} else if (s[i] == ')') {
while (C.top() != '(') {
char op = C.top();
C.pop();
bool tmp1 = B.top();
B.pop();
bool tmp2 = B.top();
B.pop();
if (op == '&')
B.push(tmp2 && tmp1);
else if (op == '|')
B.push(tmp2 || tmp1);
}
C.pop();
while (!C.empty() && C.top() == '!') {
bool tmp = B.top();
B.pop();
B.push(!tmp);
C.pop();
}
} else if (s[i] == '&') {
while (!C.empty() && C.top() == '&') {
C.pop();
bool tmp1 = B.top();
B.pop();
bool tmp2 = B.top();
B.pop();
B.push(tmp1 && tmp2);
}
C.push(s[i]);
} else if (s[i] == '|') {
while (!C.empty() && (C.top() == '|' || C.top() == '&')) {
bool tmp1 = B.top();
B.pop();
bool tmp2 = B.top();
B.pop();
char op = C.top();
C.pop();
if (op == '&')
B.push(tmp1 && tmp2);
else if (op == '|')
B.push(tmp1 || tmp2);
}
C.push(s[i]);
}
}
while (!C.empty()) {
bool tmp1 = B.top();
B.pop();
bool tmp2 = B.top();
B.pop();
char op = C.top();
C.pop();
if (op == '&')
B.push(tmp1 && tmp2);
else if (op == '|')
B.push(tmp1 || tmp2);
}
if (B.top())
cout << "V" << endl;
else
cout << "F" << endl;
}
return 0;
}