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

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

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

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

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

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

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

Программа будет продолжать принимать и оценивать выражения до тех пор, пока пользователь сам не введет ноль (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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]