首页 > 解决方案 > 我正在用 C++ 创建一个计算器,它具有撤消和清除功能。使用堆栈

问题描述

对于我的任务,我需要使用堆栈制作计算器。我得到了加减乘法部分。我基诺撤消我只是弹出堆栈,为了清楚起见,我可以在堆栈顶部添加一个 0,但是每次用户输入 U 或 C 时,程序都会崩溃,因为用户输入应该是 int。

输出:

=>1
2
+
=>3
2
-
=>1
9
*
=>9
9
/
=>1
u
=>9
c
=>0
#include <iostream>
#include <sstream>
#include <stack>

using namespace std;

int add(int a, int b)
{
    int x;
    x = a + b;
    return x;
}

int sub(int a, int b)
{
    int x;
    x = a - b;
    return x;
}

int multi(int a, int b)
{
    int x;
    x = a * b;
    return x;
}

int divide(int a, int b)
{
    int x;
    x = a / b;
    return x;
}

int main()
{
    stack<int>math;
    char ASMD;
    int x = 0;
    int a = 0;
    int b = 0;
    bool control = false;

    math.push(x);

    cout << "=> " << math.top() << endl;

    while (control == false)
    {
        cin >> b;
        cin >> ASMD;
        a = math.top();

        switch (ASMD)
        {
            case '+':
            {
                x = add(a, b);
                break;

            }
            case '-':
            {
                x = sub(a, b);
                break;
            }
            case '*':
            {
                x = multi(a, b);
                break;
            }
            case '/':
            {
                if (b != 0)
                {
                    x = divide(a, b);
                    break;
                }
                else
                {
                    cout << "error: can't divide my 0" << endl;
                    break;
                }

            }

            default:
            {
                control = true;
                break;
            }

        }

        math.push(x);
        cout << "=> " << math.top() << endl;

    }
    return 0;

}

标签: c++stack

解决方案


如果您想实现一个计算器,请使用 Shutting Yard 算法。该算法的工作方式与交换两个数组中的位置相同,不同之处在于它不是使用单个单元格作为临时存储,而是使用堆栈。最终结果是将人类可读的表达式(中缀符号)符号转换为计算机可执行表达式(后缀符号)。例如,调车场会将这个中缀表达式“1 + 1”翻译成“1 1 +”。后缀表达式存储在堆栈中,并通过从后缀堆栈中弹出元素进行评估,直到到达运算符为止。取运算符并将其应用于已弹出的数字。这是一个超级简短的概述,所以这里有更多:

罗塞塔代码:http ://www.rosettacode.org/wiki/Parsing/Shunting-yard_algorithm 维基:https ://en.wikipedia.org/wiki/Shunting-yard_algorithm

我已经实施了几次,所以如果您需要更多帮助,请询问!


推荐阅读