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

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

为了实现一个基于栈的中缀表达式求值的程序,我们可以使用两个栈来分别存储操作数和操作符。以下是C++代码实现: ```cpp #include <iostream> #include <stack> #include <sstream> #include <iomanip> #include <cctype> #include <map> using namespace std; // 定义运算符的优先级 map<char, int> precedence = { {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2} }; // 判断字符是否为运算符 bool isOperator(char c) { return precedence.find(c) != precedence.end(); } // 进行运算 double applyOperation(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 计算中缀表达式的值 double evaluateExpression(const string& expression) { stack<double> values; // 操作数栈 stack<char> ops; // 操作符栈 istringstream iss(expression); char ch; while (iss >> ch) { if (isdigit(ch) || ch == '.') { iss.putback(ch); // 回退一个字符 double value; iss >> value; // 读入一个数 values.push(value); } else if (isOperator(ch)) { while (!ops.empty() && precedence[ops.top()] >= precedence[ch]) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOperation(val1, val2, op)); } ops.push(ch); } else if (ch == '(') { ops.push(ch); } else if (ch == ')') { while (!ops.empty() && ops.top() != '(') { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOperation(val1, val2, op)); } ops.pop(); // 弹出 '(' } } while (!ops.empty()) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOperation(val1, val2, op)); } return values.top(); } int main() { string line; while (getline(cin, line)) { if (line == "=") break; // 结束条件 line.erase(remove(line.begin(), line.end(), ' '), line.end()); // 去掉空白字符 double result = evaluateExpression(line); cout << fixed << setprecision(2) << result << endl; } return 0; } ``` 代码说明: 1. 运算符优先级: 使用一个map来定义运算符的优先级。 2. 栈: 使用两个栈,一个用于存储数值(`values`),一个用于存储运算符(`ops`)。 3. 读取输入: 使用`istringstream`逐个读取并处理字符。 4. 处理运算: - 如果是数字,则读取完整的数字并推入数值栈。 - 如果是运算符,则根据优先级决定是否立即计算(弹出栈顶元素运算)。 - 特殊处理括号,遇到右括号时进行相应计算直到遇到左括号。 5. 最终输出: 在所有运算结束后输出结果,保留两位小数。 使用方法: - 直接运行程序并输入中缀表达式,以 `=` 结尾。 - 输入仅包含正数和基本运算符。 - 使用 `=` 单独一行作为结束标识。 [2024-10-26 20:09:55 | AI写代码神器 | 2108点数解答]

相关提问