#include <iostream>
#include <stack>
#include <cctype> //包含字符处理函数库,例如isdigit函数用于检查字符是否是数字。
using namespace std;
bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
} //定义了一个函数,用于判断给定字符是否是算术操作符。
int precedence(char op) {
if (op == '+' || op == '-')
return 1;
else if (op == '*' || op == '/')
return 2;
else
return 0;
} // 定义了一个函数,用于获取算符的优先级。
void applyOperator(stack<char>& operators, stack<int>& values) {
char op = operators.top();
operators.pop();
int right_operand = values.top();
values.pop();
int left_operand = values.top();
values.pop();
switch (op) {
case '+':
values.push(left_operand + right_operand);
break;
case '-':
values.push(left_operand - right_operand);
break;
case '*':
values.push(left_operand * right_operand);
break;
case '/':
values.push(left_operand / right_operand);
break;
}
} //定义了一个函数,用于应用操作符到操作数上,执行相应的操作。
int evaluateExpression(const string& expression) {
stack<char> operators; // 创建一个操作符栈
stack<int> values; // 创建一个操作数栈
for (int i = 0; i < expression.length(); ++i) {
if (isdigit(expression[i])) {
int num = 0;
while (i < expression.length() && isdigit(expression[i])) { // 循环直到不是数字为止
num = num * 10 + (expression[i] - '0'); // 将连续的数字字符转换为数字
++i;
}
values.push(num); // 将数字压入操作数栈
--i; // 退回到最后一个数字的位置
} else if (isOperator(expression[i])) { // 如果当前字符是操作符
while (!operators.empty() && precedence(operators.top()) >= precedence(expression[i])) {
applyOperator(operators, values); // 应用操作符到操作数上
}
operators.push(expression[i]); // 将操作符压入操作符栈
} else if (expression[i] == '(') {
operators.push(expression[i]);
} else if (expression[i] == ')') { // 如果当前字符是右括号
while (operators.top() != '(') { // 当栈顶不是左括号时
applyOperator(operators, values); // 应用操作符到操作数上
}
operators.pop(); // 弹出左括号
} else if (expression[i] != '#') { // 如果当前字符是非法字符
return 0; // 返回0,表示表达式包含非法字符
}
}
while (!operators.empty()) { // 当操作符栈非空时
applyOperator(operators, values); // 应用操作符到操作数上
}
return values.top(); // 返回操作数栈顶的值,即表达式的计算结果
} //定义了一个函数,用于评估给定的表达式,并返回计算结果。
int main() {
string expr;
getline(cin, expr);
int result = evaluateExpression(expr);
if (result == 0) {
cout << "NO" << endl;
} else {
cout << result << endl;
}
return 0;
}
HNU 数据结构与算法 实验一 线性结构编程题1. 表达式求值
最新推荐文章于 2024-11-02 20:20:37 发布