C++利用双栈实现含括号及四则运算的表达式求值算法(以#结束)
要实现一个使用栈来求解表达式的算法,我们可以采用两个栈:一个用于存储操作数(数字),另一个用于存储操作符。以下是一个C++程序的示例,实现了这个功能。 ```cpp #include <iostream> #include <stack> #include <cctype> using namespace std; // 函数原型声明 int precedence(char op); int applyOp(int a, int b, char op); int evaluateExpression(const string& expression) { stack<int> values; // 用于存储操作数 stack<char> ops; // 用于存储操作符 for (int i = 0; i < expression.length(); ++i) { if (expression[i] == ' ') continue; // 忽略空格 if (isdigit(expression[i])) { // 如果是数字,直接压入values栈 values.push(expression[i] - '0'); } else if (expression[i] == '(') { // 左括号直接压入ops栈 ops.push(expression[i]); } else if (expression[i] == ')') { // 右括号,弹出并计算直到遇到左括号 while (!ops.empty() && ops.top() != '(') { int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } // 弹出左括号 if (!ops.empty()) ops.pop(); } else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { // 处理操作符 while (!ops.empty() && precedence(ops.top()) >= precedence(expression[i])) { int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } // 当前操作符压入ops栈 ops.push(expression[i]); } else if (expression[i] == '#') { // 表达式结束,处理剩余的操作符 while (!ops.empty()) { int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } break; } } // 返回最终结果 return values.top(); } int precedence(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; return 0; } int applyOp(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } return 0; } int main() { string expression; getline(cin, expression); int result = evaluateExpression(expression); cout << result << endl; return 0; } ``` 代码解释 1. 函数原型声明: - `int precedence(char op);`:返回操作符的优先级。 - `int applyOp(int a, int b, char op);`:应用操作符并返回结果。 2. evaluateExpression函数: - 使用两个栈:`values`用于存储操作数,`ops`用于存储操作符。 - 遍历输入的表达式字符串,根据字符类型进行不同的处理: - 数字直接压入`values`栈。 - 左括号直接压入`ops`栈。 - 右括号弹出并计算直到遇到左括号。 - 操作符根据优先级进行处理,必要时弹出并计算。 - 表达式结束符`#`处理剩余的操作符。 3. precedence函数: - 返回操作符的优先级,加减为1,乘除为2。 4. applyOp函数: - 根据操作符执行相应的运算并返回结果。 5. main函数: - 读取输入的表达式字符串。 - 调用`evaluateExpression`函数计算结果并输出。 示例运行 输入: ``` 6-(9-3)/2-(7-1)/3# ``` 输出: ``` 1 ``` 输入: ``` 9-3*(9-7)/2-4*3# ``` 输出: ``` -6 ``` ######[AI写代码神器 | 1018点数解答 | 2024-10-19 16:12:31]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)262
- Python 实现实数四则运算:输入表达式输出结果,处理除零与格式错误(字节豆包 | 286点数解答 | 2024-11-17 11:21:58)129
- C 语言实现:输入实数四则运算式输出保留两位小数结果(含特殊情况处理) (字节豆包 | 320点数解答 | 2024-11-17 11:22:27)145
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)212
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)345
- 优化高中英语核心词汇短语HTML页面,这些建议不容错过!(DeepSeek | 217点数解答 | 2025-07-01 23:41:02)189
- 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轻松将PPT每页转为图片,附代码示例!(阿里通义 | 315点数解答 | 2024-04-23 10:01:04)1351
- Winform开发:含验证与清空功能的注册页面实现(GPT | 5266点数解答 | 2024-06-14 16:04:40)483
- Python 实战:购物折扣计算、列表求和与平方数推导代码全解(字节豆包 | 235点数解答 | 2024-10-28 14:46:54)229