C++实现基于栈的中缀算术表达式直接求值,含代码详解!
为了实现一个基于栈的中缀表达式求值的程序,我们可以使用两个栈来分别存储操作数和操作符。以下是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. 最终输出: 在所有运算结束后输出结果,保留两位小数。 使用方法: - 直接运行程序并输入中缀表达式,以 `=` 结尾。 - 输入仅包含正数和基本运算符。 - 使用 `=` 单独一行作为结束标识。 ######[AI写代码神器 | 2108点数解答 | 2024-10-26 20:09:55]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)262
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)212
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)345
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)227
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)313
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)464
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)356
- JavaScript 开发揭秘:表达式 {{data}} 的工作原理及模板字符串应用(阿里通义 | 226点数解答 | 2023-11-09 01:17:26)244
- 揭秘!Angular表达式 {{yourmodel}} 的工作原理与灵活应用(阿里通义 | 187点数解答 | 2023-11-09 01:18:41)214
- Python 实现实数四则运算:输入表达式输出结果,处理除零与格式错误(字节豆包 | 286点数解答 | 2024-11-17 11:21:58)130
- C 语言实现:输入实数四则运算式输出保留两位小数结果(含特殊情况处理) (字节豆包 | 320点数解答 | 2024-11-17 11:22:27)145
- MATLAB 实现:自定义输入信号与频率的时域采样定理演示系统(字节豆包 | 417点数解答 | 2024-12-17 20:28:04)278