为了实现一个基于栈的中缀表达式求值的程序,我们可以使用两个栈来分别存储操作数和操作符。以下是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点数解答]