gpt4 book ai didi

c++ - 后缀表示法计算器 (RPN) 问题 C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:00:57 25 4
gpt4 key购买 nike

几天前在同一个程序上获得帮助后讨厌回来寻求帮助,但我真的很难完成这个程序。简而言之,我需要创建一个带有链表堆栈的后缀表示法计算器 (RPN),它允许我执行 5 5 5++ (=15) 等表达式。我现在已经成功地完成了主要的计算部分,但我正在努力处理其中的两个错误。其中之一是“运算符太多”,另一个是“操作数太多”。目前正在研究“太多的运算符(operator)”,我觉得我很接近但不能完全到达那里。

如果用户在第一次输入时输入 5 5++,它会捕捉到它并说“操作数太多”。但是,如果先前计算的堆栈中已经存在某些内容,然后他们键入相同的表达式 5 5++,这并不是说堆栈为空,而是使用先前的数字输出答案。如果有人能看到我哪里出错了,并指出我找出另一个错误“操作符太多”(例如:5 5 5 +)的方向,那将不胜感激。再次感谢。

(在弄乱它之后,似乎我做的计算越多,实际上需要放置更多的运算符才能被认为是空的。我猜我需要在每个表达式之前的某个地方 popVal 但不确定在哪里把它,因为我已经尝试了很多地方,但它不工作)

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

using namespace std;

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

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

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

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

}

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;
}


void performOp(const string& input, SLLNode& stack)
{
double fVal, sVal;
int errorCheck = 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;
errorCheck = 1;
}

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

int main()
{
cout << "::::::::::::::::RPN CALCULATOR:::::::::::::::::" << endl;
cout << "::TYPE IN A POSTFIX EXPRESSION OR 'q' TO QUIT::" << endl;
cout << ":::::::::::::::::::::::::::::::::::::::::::::::" << endl << endl;

string input;
SLLNode stack;
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;
}
}
}

最佳答案

基本思路是:

  1. 读取一行 ( std::getline );
  2. 处理这一行 ( std::stringstream );
  3. 输出答案或任何错误;
  4. 清理堆栈(或销毁堆栈并在第 2 步创建一个新堆栈);
  5. 转到 1 并重复。

您缺少的是第一步。如果您直接从 stdin 获取所有内容,您会将换行符视为一个简单的空格。

关于c++ - 后缀表示法计算器 (RPN) 问题 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com