首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用链表的RPN

使用链表的RPN
EN

Stack Overflow用户
提问于 2015-08-28 13:37:01
回答 1查看 1.1K关注 0票数 0

我在找出一个RPN计算器时遇到了麻烦,在这个计算器中,我们必须使用链表来完成这项任务。(我已经使用stack<double>方法完成了赋值,但它必须使用链表。

我在错误检查方面遇到了一些问题:

运算符(+ -/ *)太多操作数(双精度)被零除

程序应该继续接受和计算表达式,直到用户在一行中输入一个零(0),后面跟着一个新行。我在这方面也遇到了一些问题。由于我在错误检查中设置了“操作数太多”,它不允许我执行第二次计算,输出将是“操作数太多”。

我似乎不能得到一个错误检查工作的“太多的操作员”

我已经尝试了几种不同的方法来进行所需的错误检查,并在不同的站点上查看了许多其他RPN问题,正如您可以看到的那样,我尝试并注释掉了一些东西。任何帮助都将不胜感激!谢谢

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

struct NODE
{
       float num;
       NODE *next;
};

class stack
{
    private:
      NODE *head;

    public:
      stack();
      void push(float);
      float pop();
      int nElements();
      float display();
};

class RPN: public stack
{
    public:
      void add();
      void subtract();
      void multiply();
      void divide();
};


stack::stack()
{
     head = NULL;
}

void stack::push(float a_number)
{
     NODE *temp = new NODE;
     if (temp)
     {
        temp->num = a_number;
        temp->next = head;
        head = temp;
     }
}

float stack::pop()
{
    float number = 0;


    if (!head)
      {
         return 0;
      }
      else
      {
           NODE *temp = head;
           number = head->num;
           head = temp->next;
           delete temp;
      }
      return number;
}

int stack::nElements()
{
    int counter=0;
    for (NODE *node = head; node; node=node->next)
    {
        counter++;
    }
    return counter;
}

float stack::display()
{





   //ERROR CHECKING TOO MANY OPERANDS??? PRINTING TOO MANY OPERANDS           FOR :   100 10 50 25 / * - -2 / = , but still giving correct output && WILL NOT   ALLOW ME TO DO A SECOND CALCULATAION , OUTPUT WILL BE TOO MANY OPERANDS

       if(nElements() !=1)
      {
           cout << "Error: too many operands" << endl;
            return 1;
      }

       /*
        //   if( nElements() < 2 )
            {
                cout << "Error: too many operators" << endl;
                return 1;
            }
         */



               else //(nElements() > 0)
               {
                 float temp = pop();
                 cout << temp << endl;
                 push(temp);

                 return temp;

               }



}


void RPN::add()
{
     if (nElements()>=2)
     {
        push(pop() + pop());
     }
}

void RPN::subtract()
{
     if (nElements()>=2)
     {
        push(0 - pop() + pop());
     }
}

void RPN::multiply()
{
     if (nElements()>=2)
     {
        push(pop() * pop());
     }
}



 int RPN::divide()
{

    double op2;

    op2 = pop();

    if(op2 != 0.0)
    {
    push(pop() / op2);
    }
    else
    {
    cout << "Error: Division by zero.\n";     //??? Still printing output
    return -1;
    }
}


//Function prototype for isOperator
bool isOperator(const string& input);

//Function prototype for perforOperation
int performOperation(const string& input, RPN& calculator);

Int main(){

    RPN calculator;
    string input;

     float num;

    cout << "RPN Calculator: " << endl;
    cout << "Input\n";


    while(input != "0")
           {
               //Terminate program when 0 is entered by user
               while(true)
               {

               // get input
               cin >> input;

               // check for being numeric value

                   if(istringstream(input) >> num)
                   {
                       //use push function
                       calculator.push(num);
                   }

                   // check for operator
                   else if(isOperator(input))
                   {
                       performOperation(input, calculator);
                   }

                   // If user enters 0 on a line followed by a new line, the    program exits     ????????????
                   else if(input == "0\n")
                   {
                       return -1;
                   }


               }
               }
   }

bool isOperator(const string& input)
{
    static const string operators ="-+*/";
    if (input.length() == 1) // right size to be an operator.
    {
        return operators.find_first_of(input[0]) != string::npos;
        // look in the operator string for the first (and only) character in input
    }
    return false;
}



int performOperation(const string& input, RPN& calculator)
{
    //double firstOperand = 0;
    //double secondOperand = 0;
    //double result;



    /*
    if( calculator.size() > 2 )                      //Error check gives a false error for last input ???
    {
        cout << "Error: too many operands" << endl;
        return 1;
    }

    //Error chceck for too many operators           ////STILL PRINT OUTPUT???
    if( calculator.size() < 2 )
        {
            cout << "Error: too many operators" << endl;
            return 1;
        }
*/


    switch (input[0])
    {
    case '+': calculator.add();
              calculator.display();
              break;
    case '-': calculator.subtract();
              calculator.display();
              break;
    case '*': calculator.multiply();
              calculator.display();
              break;
    case '/':  calculator.divide();

                //if (firstOperand / 0) 
                //{
                //  cout << "Error: Divide by 0.\n";
                //}
               calculator.display();
              break;
    }
                            /*
                            if (secondOperand == 0)
                                        { // moved this test to here because it's the only place it matters.
                                            cout << "Error: Division by 0.\n";
                                            return -1;
                                        }
*/





return 0;

}

This is the sample input and output


Input   Output
10 15 + =   25
10 15 - =   -5
2.5 3.5 + = 6 (or 6.0)
10 0 / =    Error: Division by zero
10 20 * / = Error: Too many operators
12 20 30 / =    Error: Too many operands
-10 -30 - = 20
100 10 50 25 / * - -2 / =   -40




I got the error division by 0 check to work, It just keeps printing the output in addition to the error...How could I fix this?
int RPN::divide()
{

    double op2;

    op2 = pop();

    if(op2 != 0.0)
    {
    push(pop() / op2);
    }
    else
    {
    cout << "Error: Division by zero.\n";
    return -1;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-28 14:41:42

问题是你总是把计算的结果放在堆栈上。因此,当你进行第二次计算时,你不会从一个空的堆栈开始。简单的解决方法是在stack::display()中删除此行

代码语言:javascript
复制
push(temp);

可能也应该将stack::display()重命名为stack::display_and_pop()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32264011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档