在C++编程中,如何利用栈(stack)数据结构来实现一个简单的四则运算计算器?
时间: 2024-11-30 19:13:40 浏览: 21
在C++中,你可以通过利用栈(Stack)的数据结构来实现一个简单的四则运算计算器,这是因为栈是一种后进先出(LIFO,Last In First Out)的数据结构,非常适合处理递归计算的过程,特别是对于需要临时存储操作数的情况。下面是一个简单的步骤说明:
1. 定义一个`Token`枚举,用于表示操作数、运算符和结束标志:
```cpp
enum class Token {
Number,
Operator,
End
};
```
2. 创建一个栈来存储操作数和运算符:
```cpp
stack<Token> expressionStack;
```
3. 定义一个函数`pushToStack`,用于将数字和运算符压入栈中:
```cpp
void pushToStack(string token) {
if (isdigit(token[0])) {
// 对于数字,直接转换成整数并压入栈
int num = stoi(token);
expressionStack.push(Token::Number);
expressionStack.top() = static_cast<int>(num);
} else {
// 对于运算符,检查栈顶是否已有运算符,若无则直接压入,若有则比较优先级
while (!expressionStack.empty() && isOperator(expressionStack.top()) &&
precedence(expressionStack.top()) <= precedence(token)) {
processOperator();
}
expressionStack.push(token);
}
}
// ...定义`precedence`和`processOperator`等辅助函数
```
4. `processOperator`函数会弹出两个操作数,执行相应的运算,并把结果压回栈中:
```cpp
int performOperation(int a, char op, int b) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b; // 注意除法可能涉及浮点数
}
}
void processOperator() {
int operand2 = expressionStack.top(); // 弹出第二个操作数
expressionStack.pop();
int operand1 = expressionStack.top(); // 弹出第一个操作数
expressionStack.pop();
int result = performOperation(operand1, expressionStack.top(), operand2); // 计算结果
expressionStack.pop(); // 弹出当前运算符
expressionStack.push(result); // 把结果压回栈
}
```
5. 当遇到`EOF`(即输入结束)或者栈为空时,认为表达式已处理完毕,开始计算剩余的运算:
```cpp
while (!expressionStack.empty()) {
processOperator();
}
if (expressionStack.top() != Token::End) {
cout << "Invalid expression" << endl;
} else {
cout << "Result: " << expressionStack.top().get<int>() << endl; // 输出最终结果
}
```
阅读全文