Мне нужно создать калькулятор RPN (postfix notation), который выполняет простые операции (+, -, *, /), используя связанный список для поддержки стека. Я получил большинство из них, но я столкнулся с несколькими проблемами. Я могу вычислить любые два числа с одним операндом (например: 5 5 + = 10), но не может сделать ничего больше. Я провел некоторое исследование в Интернете и наблюдал за несколькими видеороликами YouTube, чтобы добраться туда, где я сейчас, но большинство используют ссылку на стек, чтобы сделать это. Я попытался объединить учебники по этому поводу, а также как создать собственный стек.Проблемы вычисления постфиксного выражения с более чем двумя операндами
Я довольно новичок в этом и довольно потерял способ вычисления большего выражения (например: 5 5 5 + + = 15), и мне также нужно проверить наличие ошибок, которые я выполнил, но с которыми я борюсь, - «слишком много операторов» и «слишком много операндов». С слишком большим количеством операторов я предполагаю, что это имеет какое-то отношение к тому, что вы не можете выкинуть значение, потому что там нет никого, но это насколько я могу (если он прав, все еще не совсем уверен, как реализовать Это). Любая помощь в любой из этих трех вещей или что-то еще, что вы можете увидеть здесь, будет очень оценена.
#include<iostream>
#include<string>
#include<sstream>
#include<iomanip>
using namespace std;
class SLLNode
{
double data;
SLLNode *top;
SLLNode *ptr;
public:
SLLNode()
{
top = NULL;
ptr = NULL;
}
void pushVal(double val)
{
SLLNode *next = new SLLNode;
next -> data = val;
next -> ptr = top;
top = next;
}
double popVal()
{
SLLNode *next = new SLLNode;
next = top;
top = top -> ptr;
next -> ptr = NULL;
return next -> data;
delete next;
}
void print()
{
SLLNode *next = new SLLNode;
next = top;
cout << "= " << next -> data << endl << ">>";
next = next -> ptr;
delete next;
}
};
bool isOperator(const string& input)
{
string ops[] = {"+", "-", "*", "/"};
for(int i = 0; i < 4; i++)
{
if(input == ops[i])
{
return true;
}
}
return false;
}
void performOp(const string& input, SLLNode& stack)
{
double fVal, sVal;
int result = 0;
sVal = stack.popVal();
fVal = stack.popVal();
if(input == "+")
{
stack.pushVal(fVal + sVal);
}
else if(input == "-")
{
stack.pushVal(fVal - sVal);
}
else if(input == "*")
{
stack.pushVal(fVal*+ sVal);
}
else if(input == "/" && sVal != 0)
{
stack.pushVal(fVal/sVal);
}
if(input == "/" && sVal == 0)
{
cout << "Error: Division by zero" << endl;
result = 1;
}
if(result == 0)
{
stack.print();
}
}
int main()
{
string input;
SLLNode stack;
cout << "::::::::::::::::RPN CALCULATOR:::::::::::::::::" << endl;
cout << "::TYPE IN A POSTFIX EXPRESSION OR 'q' TO QUIT::" << endl;
cout << ":::::::::::::::::::::::::::::::::::::::::::::::" << endl << endl;
cout << ">>";
while(true)
{
cin >> input;
double num;
if(istringstream(input) >> num)
{
stack.pushVal(num);
}
else if (isOperator(input))
{
performOp(input, stack);
}
else if (input == "q")
{
return 0;
}
else
{
cout << "Error: Invalid input" << endl;
}
}
}
Фантастично, большое вам спасибо.Сейчас все работает по большей части, просто нужно много сделать, но нужно сначала выполнить основную функцию. Я действительно, действительно, ценю это. – Tyler