酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

基于栈的中缀算术表达式求值 用c++语言 题目描述 本关任务:输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。) 输入要求 多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只 有一个“=”时,输入结束。参加运算的数为double类型。 输出要求 对于每组数据输出1行,为表达式的运算结果。输出保留两位小数。 输入样例 2+2= 20*(4.5-3)=

以下是使用 C++ 实现基于栈的中缀算术表达式求值的代码: ```cpp #include <iostream> #include <stack> #include <string> #include <cctype> double calculate(double num1, double num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': if (num2!= 0) { return num1 / num2; } else { std::cout << "除数不能为 0" << std::endl; return 0; } } return 0; } double evaluateInfixExpression(std::string expression) { std::stack<double> operandStack; std::stack<char> operatorStack; for (int i = 0; i < expression.size(); i++) { if (isdigit(expression[i]) || expression[i] == '.') { std::string numStr; while (i < expression.size() && (isdigit(expression[i]) || expression[i] == '.')) { numStr += expression[i++]; } i--; operandStack.push(atof(numStr.c_str())); } else if (expression[i] == '(') { operatorStack.push(expression[i]); } else if (expression[i] == ')') { while (operatorStack.top()!= '(') { double num2 = operandStack.top(); operandStack.pop(); double num1 = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(num1, num2, op)); } operatorStack.pop(); } else if (expression[i] == '+' || expression[i] == '-') { while (!operatorStack.empty() && operatorStack.top()!= '(') { double num2 = operandStack.top(); operandStack.pop(); double num1 = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(num1, num2, op)); } operatorStack.push(expression[i]); } else if (expression[i] == '*' || expression[i] == '/') { while (!operatorStack.empty() && (operatorStack.top() == '*' || operatorStack.top() == '/')) { double num2 = operandStack.top(); operandStack.pop(); double num1 = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(num1, num2, op)); } operatorStack.push(expression[i]); } } while (!operatorStack.empty()) { double num2 = operandStack.top(); operandStack.pop(); double num1 = operandStack.top(); operandStack.pop(); char op = operatorStack.top(); operatorStack.pop(); operandStack.push(calculate(num1, num2, op)); } return operandStack.top(); } int main() { std::string expression; while (true) { std::getline(std::cin, expression); if (expression == "=") { break; } double result = evaluateInfixExpression(expression.substr(0, expression.size() - 1)); std::printf("%.2f\n", result); } return 0; } ``` 这段代码实现了对中缀表达式的求值,通过两个栈分别存储操作数和操作符,并按照运算符的优先级进行计算。 [2024-10-26 20:10:49 | AI写代码神器 | 872点数解答]

相关提问