利用栈实现简单的计算器

发布时间 2023-07-19 16:11:34作者: ⭐⭐-fighting⭐⭐

使用栈实现简单的计算器

在本文中,我们将使用栈这种常见的数据结构来实现一个简单的计算器,可以进行基本的四则运算。我们将介绍栈的概念以及它在计算器中的应用,并提供使用C++实现计算器的完整代码。

栈的概念

栈是一种具有后进先出(LIFO,Last-In-First-Out)特性的数据结构。它类似于我们平常使用的弹夹,最后压入的子弹会最先弹出。栈的操作包括入栈(将元素压入栈顶)和出栈(从栈顶弹出元素)。

计算器的实现

我们将使用栈来实现一个简单的计算器,它可以进行基本的四则运算:加法、减法、乘法和除法。

1. 定义栈数据结构

我们首先需要定义一个栈数据结构,用于存储操作数和运算符。

#include <iostream>
#include <stack>
using namespace std;

class Calculator {
private:
    stack<int> numStack;  // 存储操作数的栈
    stack<char> opStack;  // 存储运算符的栈

    // 判断运算符的优先级
    int priority(char op) {
        if (op == '+' || op == '-') return 1;
        if (op == '*' || op == '/') return 2;
        return 0;
    }

    // 计算两个操作数的结果
    int calculate(int num1, int num2, char op) {
        switch (op) {
            case '+': return num1 + num2;
            case '-': return num1 - num2;
            case '*': return num1 * num2;
            case '/': return num1 / num2;
            default: return 0;
        }
    }

public:
    int calculateExpression(string expression);
};

2. 实现计算方法

接下来,我们将实现计算器的核心方法calculateExpression,它将根据输入的表达式进行计算。

int Calculator::calculateExpression(string expression) {
    for (int i = 0; i < expression.length(); i++) {
        char c = expression[i];
        if (isdigit(c)) {
            // 处理数字,连续数字字符可能是多位数
            int num = 0;
            while (i < expression.length() && isdigit(expression[i])) {
                num = num * 10 + (expression[i] - '0');
                i++;
            }
            i--;  // 回退一个字符,因为for循环会再次自增
            numStack.push(num);
        } else if (c == '(') {
            // 处理左括号,直接入栈
            opStack.push(c);
        } else if (c == ')') {
            // 处理右括号,进行运算直到遇到左括号
            while (!opStack.empty() && opStack.top() != '(') {
                char op = opStack.top();
                opStack.pop();
                int num2 = numStack.top();
                numStack.pop();
                int num1 = numStack.top();
                numStack.pop();
                int result = calculate(num1, num2, op);
                numStack.push(result);
            }
            opStack.pop();  // 弹出左括号
        } else if (c == '+' || c == '-' || c == '*' || c == '/') {
            // 处理运算符,根据优先级进行运算
            while (!opStack.empty() && priority(opStack.top()) >= priority(c)) {
                char op = opStack.top();
                opStack.pop();
                int num2 = numStack.top();
                numStack.pop();
                int num1 = numStack.top();
                numStack.pop();
                int result = calculate(num1, num2, op);
                numStack.push(result);
            }
            opStack.push(c);
        }
    }

    // 计算剩余的运算
    while (!opStack.empty()) {
        char op = opStack.top();
        opStack.pop();
        int num2 = numStack.top();
        numStack.pop();
        int num1 = numStack.top();
        numStack.pop();
        int result = calculate(num1, num2, op);
        numStack.push(result);
    }

    return numStack.top();  // 返回最终结果
}

3. 测试计算器

我们编写一个简单的测试函数来验证计算器的正确性。

int main() {
    Calculator calculator;
    string expression;

    cout << "请输入表达式(例如

:3+5*2-4/2):";
    cin >> expression;

    int result = calculator.calculateExpression(expression);
    cout << "计算结果:" << result << endl;

    return 0;
}

结论

通过使用栈这种数据结构,我们成功实现了一个简单的计算器,可以进行基本的四则运算。栈在计算机科学中有着广泛的应用,它可以用于解决许多问题,包括算术表达式的计算。希望通过本文,你对栈的概念和在计算器中的应用有了更深入的了解。