C++实现:基于栈直接求解中缀算术表达式的值(含多组输入处理)
为了实现基于栈的中缀算术表达式求值,我们需要处理运算符优先级和括号。以下是一个完整的C++程序,它读取多组中缀表达式并计算其结果: ```cpp #include <iostream> #include <stack> #include <sstream> #include <string> #include <cctype> #include <iomanip> using namespace std; // 判断字符是否为操作符 bool isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取操作符的优先级 int getPrecedence(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; return 0; } // 执行简单的二元运算 double applyOp(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } return 0; } // 计算中缀表达式的值 double evaluateExpression(const string& expression) { stack<double> values; // 存储操作数 stack<char> ops; // 存储操作符 for (size_t i = 0; i < expression.length(); i++) { // 跳过空格 if (isspace(expression[i])) continue; // 如果当前字符是数字或小数点,则解析整个数字 if (isdigit(expression[i]) || expression[i] == '.') { stringstream ss; while (i < expression.length() && (isdigit(expression[i]) || expression[i] == '.')) { ss << expression[i++]; } double val; ss >> val; values.push(val); i--; // 因为for循环会再次增加i,所以这里需要减1 } // 如果是左括号,直接压入操作符栈 else if (expression[i] == '(') { ops.push(expression[i]); } // 如果是右括号,则弹出操作符直到遇到左括号 else if (expression[i] == ')') { 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(applyOp(val1, val2, op)); } ops.pop(); // 弹出左括号 } // 如果是操作符 else if (isOperator(expression[i])) { while (!ops.empty() && getPrecedence(ops.top()) >= getPrecedence(expression[i])) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } ops.push(expression[i]); } } // 最后处理剩余的操作符 while (!ops.empty()) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } return values.top(); } int main() { string line; while (getline(cin, line)) { if (line == "=") break; // 输入结束条件 if (line.back() == '=') line.pop_back(); // 去掉等号 double result = evaluateExpression(line); cout << fixed << setprecision(2) << result << endl; } return 0; } ``` 代码说明: 1. isOperator: 判断一个字符是否是操作符。 2. getPrecedence: 返回操作符的优先级。 3. applyOp: 根据操作符对两个操作数进行计算。 4. evaluateExpression: 使用两个栈分别存储操作数和操作符,遍历表达式并根据操作符的优先级进行计算。 5. main: 读取输入,调用`evaluateExpression`函数计算结果并输出。 这个程序能够正确处理包含括号和不同优先级操作符的中缀表达式,并且保留两位小数输出结果。 ######[AI写代码神器 | 1132点数解答 | 2024-10-26 20:11:07]
- 递归下降语法分析程序实例:从文法到 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
- CentOS下Java进程出现futex_wait_queue_me问题的处理全流程(阿里通义 | 283点数解答 | 2023-11-20 14:51:26)460
- 替雷利珠单抗致免疫相关性糖尿病:病例报道与机制探讨,为临床用药敲响警钟( | 164点数解答 | 2024-10-11 14:52:52)265
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)313
- 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
- 基于 LPC1114 的多功能电子钟:强大功能+完整代码揭秘!(字节豆包 | 787点数解答 | 2025-05-11 21:01:44)224