上一篇
在编程学习过程中,C++栈式计算器是一个经典项目,它不仅帮助我们理解栈数据结构的原理,还能深入掌握C++表达式求值的核心逻辑。本教程将手把手教你实现一个能处理中缀表达式的计算器,适合零基础小白入门。
栈式计算器利用“栈”(Stack)这种先进后出(LIFO)的数据结构来解析和计算数学表达式。常见的做法是将人类习惯的“中缀表达式”(如 3 + 5 * 2)转换为“后缀表达式”(也叫逆波兰表达式,如 3 5 2 * +),再通过栈进行高效计算。

我们需要一个函数,输入如 "3 + 5 * (2 - 1)" 的字符串,输出后缀形式 "3 5 2 1 - * +"。
规则简述:
遍历后缀表达式:
#include <iostream>#include <stack>#include <queue>#include <cctype>#include <string>#include <sstream>#include <vector>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;}// 中缀表达式转后缀(返回 token 列表)vector<string> infixToPostfix(const string& expr) { stack<char> ops; vector<string> output; string number = ""; for (char c : expr) { if (isspace(c)) continue; if (isdigit(c)) { number += c; } else { if (!number.empty()) { output.push_back(number); number = ""; } if (c == '(') { ops.push(c); } else if (c == ')') { while (!ops.empty() && ops.top() != '(') { output.push_back(string(1, ops.top())); ops.pop(); } if (!ops.empty()) ops.pop(); // 弹出 '(' } else if (isOperator(c)) { while (!ops.empty() && ops.top() != '(' && getPrecedence(ops.top()) >= getPrecedence(c)) { output.push_back(string(1, ops.top())); ops.pop(); } ops.push(c); } } } if (!number.empty()) { output.push_back(number); } while (!ops.empty()) { output.push_back(string(1, ops.top())); ops.pop(); } return output;}// 计算后缀表达式double evaluatePostfix(const vector<string>& postfix) { stack<double> nums; for (const string& token : postfix) { if (isdigit(token[0]) || (token.size() > 1 && isdigit(token[1]))) { nums.push(stod(token)); } else { double b = nums.top(); nums.pop(); double a = nums.top(); nums.pop(); char op = token[0]; switch (op) { case '+': nums.push(a + b); break; case '-': nums.push(a - b); break; case '*': nums.push(a * b); break; case '/': if (b == 0) { cerr << "Error: Division by zero!" << endl; return 0; } nums.push(a / b); break; } } } return nums.top();}int main() { string expression = "3 + 5 * (2 - 1)"; cout << "原始表达式: " << expression << endl; vector<string> postfix = infixToPostfix(expression); cout << "后缀表达式: "; for (const auto& t : postfix) { cout << t << " "; } cout << endl; double result = evaluatePostfix(postfix); cout << "计算结果: " << result << endl; return 0;}程序输出如下:
原始表达式: 3 + 5 * (2 - 1)后缀表达式: 3 5 2 1 - * + 计算结果: 8
通过本教程,你已经掌握了如何用 C++ 实现一个完整的栈式计算器。这个项目融合了栈数据结构、字符串处理、运算符优先级等核心概念,是理解C++表达式求值机制的绝佳练习。进一步地,你可以尝试支持小数、负数、更多运算符(如 ^ 幂运算)或错误处理,打造更强大的后缀表达式计算引擎。
希望这篇教程对你有帮助!动手敲一遍代码,你会收获更多。
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129027.html