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

时间:2013-10-11 00:17:27

标签: c++ linked-list stack postfix-notation rpn

几天前,在得到同一个程序的帮助后,Hate回来寻求帮助,但我真的很难完成这个程序。简而言之,我需要创建一个带有链接列表堆栈的后缀符号计算器(RPN),它允许我执行诸如5 5 5 + +(= 15)之类的表达式。我已经设法让主要的计算部分失效,但我正在努力处理两个错误。其中一个是“运营商太多”,另一个是“运营商太多”。目前正在研究“太多运营商”,我觉得我很接近,但不能完全达到目的。

如果用户在第一个条目上输入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 个答案:

答案 0 :(得分:0)

基本思路是:

  1. 阅读一行(std::getline);
  2. 处理此行(std::stringstream);
  3. 输出答案或任何错误;
  4. 清理堆栈(或将其销毁并在步骤2中创建一个新堆栈);
  5. 转到1然后重复。
  6. 您缺少的是第一步。如果直接从stdin获取所有内容,则会将换行视为一个简单的空格。