我需要创建一个 RPN(后缀符号)计算器,它可以进行简单的操作(+、-、*、/),同时使用链表来维护堆栈。我已经完成了大部分工作,但遇到了一些问题。我可以用一个操作数计算任意两个数字(例如: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;
}
}
}