实现功能:给定布尔表达式,请计算得到表达式最终值。
输入:只包含1(true)和0(false)、与(*表示)、或(|表示)与小括号形成的表达式。
输出:0(表达式结果为假)、1(表达式结果为真)
基于Monster 组和GPT的调写:
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
// 判断一个字符是否是操作符
bool isOperator(char c) {
return c == '*' || c == '|';
}
// 计算表达式的值
bool calculate(bool a, bool b, char op) {
if (op == '*') {
return a && b;
} else {
return a || b;
}
}
// 将表达式转换为后缀表达式,并计算其值
bool evaluateExpression(string expr) {
stack<char> s; // 存放操作符的栈
stack<bool> values; // 存放操作数的栈
for (int i = 0; i < expr.length(); i++) {
char c = expr[i];
if (c == '(') {
s.push(c);
} else if (c == ')') {
while (!s.empty() && s.top() != '(') {
char op = s.top();
s.pop();
bool b = values.top();
values.pop();
bool a = values.top();
values.pop();
values.push(calculate(a, b, op));
}
s.pop(); // 弹出左括号
} else if (isOperator(c)) {
while (!s.empty() && isOperator(s.top())) {
char op = s.top();
s.pop();
bool b = values.top();
values.pop();
bool a = values.top();
values.pop();
values.push(calculate(a, b, op));
}
s.push(c);
} else { // 操作数
values.push(c == '1');
}
}
while (!s.empty()) {
char op = s.top();
s.pop();
bool b = values.top();
values.pop();
bool a = values.top();
values.pop();
values.push(calculate(a, b, op));
}
return values.top();
}
int main() {
string expr;
cin >> expr;
cout << evaluateExpression(expr) << endl;
return 0;
}