Создание обратного польского калькулятора в C++

Задание: Для этого задания вы должны написать программу, которая будет рассчитывать результаты выражений обратного польского, которые предоставляет пользователь.

Вы должны обработать следующие ситуации (ошибки):

Слишком много операторов (+ - / *)

Слишком много операндов (двойников)

Деление на ноль

Программа примет польское выражение, которое разделяет операторы и операнды одним пробелом и завершает выражение знаком равенства.

Программа будет продолжать принимать и оценивать выражения до тех пор, пока пользователь сам не введет ноль (0) в строку, за которой следует новая строка.

Проблема 1: у меня проблема с сообщением пользователю, что слишком много операторов и операндов. Я пытался закодировать это, но я не знаю, с чего начать.

Проблема 2: Я хочу, чтобы программа заканчивалась, когда пользователь вводит 0, но она ничего не делает, когда я делаю это в своей программе.

#include<iostream>
#include<iomanip>
#include<string>
#include<sstream>

using namespace std;

class Node
{
    double data;
    Node *top;
    Node *ptr;
public:
    Node()
    {
        top = NULL;
        ptr = NULL;
    }

    bool isEmpty()
    {
        return top == 0;
    }

    void pushValue(double val)
    {
        Node *next = new Node;
        next->data = val;
        next->ptr = top;
        top = next;
    }

    double popVal()
    {
        if (isEmpty())
        {
            cout << "Error: Too many operators" << endl;
        }
        else
        {
            Node *next = top->ptr;
            double ret = top->data;
            delete top;
            top = next;
            return ret;
        }

    }
//Displays the answer of the equation
    void print()
    {
        cout << "= " << top->data << endl;
    }
};

bool isOperator(const string& input)
{
    string ops[] = { "+", "-", "*", "/" };
    for (int i = 0; i < 4; i++)
    {
        if (input == ops[i])
        {
            return true;
        }
    }
    return false;
}
//This function tells the operators what to do with the values.
void performOp(const string& input, Node& stack)
{
    double Val1, Val2;
    int errorCheck = 0;

    Val1 = stack.popVal();
    Val2 = stack.popVal();

    if (input == "+")
    {
        stack.pushValue(Val1 + Val2);
    }
    else if (input == "-")
    {
        stack.pushValue(Val1 - Val2);
    }
    else if (input == "*")
    {
        stack.pushValue(Val1 * Val2);
    }
    else if (input == "/" && Val2 != 0)
    {
        stack.pushValue(Val1 / Val2);
    }

    if (input == "/" && Val2 == 0)
    {
        cout << "Error: Division by zero" << endl;
        errorCheck = 1;
    }

    if (errorCheck == 0)
    {
        stack.print();
    }
}

int main()
{
    cout << "Reverse Polish Notation Calculator!" << endl;
    cout << "-------------------------------------------------------------------" << endl;
    cout << "Enter your values followed by your operators(Enter 0 to exit)" << endl;

    string input;
    Node stack;
//Checks the user's input to see which function to use.
    while (true)
    {
        cin >> input;
        double num;

        if (stringstream(input) >> num)
        {
            stack.pushValue(num);
        }
        else if (isOperator(input))
        {
            performOp(input, stack);
        }
        else if (input == "0")
        {
            return 0;
        }
    }
}

0 ответов

Другие вопросы по тегам