0

我目前正在为一个必须通过一堆整数和各种函数运行的类构建 RPN 计算器。它还必须通过 cin 语句获取输入,然后将其排序为整数或操作数,然后将其压入堆栈或从类中启动适当的函数以进行计算。

其中大部分我已经弄清楚并正在工作,但是我遇到了一个我无法弄清楚的非常奇怪的问题。

它将采用我的第一组数字和第一个操作数(例如,我输入 1 2 3 并且堆栈将显示 3、2、1 作为内容)但是在我应用第二个操作数之后,我得到了零在每个答案之前。

例子:

输入:1 2 + 2 *

预期产出:6

我得到了什么:0、2、0、3

我不确定这是否是堆栈、main 或其他地方的 push() 函数中的错误。我一直没能找到它。任何帮助将不胜感激,即使只是朝着正确方向的一点!

这是我假设在某处导致问题的代码部分:

主功能:

int main(){

  Stack mystack;

  std::string getIt; // taken as input
  int pushIt;  // converted to int and pushed if nessecary

  do{
    // get user input
    std::cin >> getIt;
    if(getIt == "@"){};
    if(getIt == "!") mystack.negate();
    if(getIt == "+") mystack.add();
    if(getIt == "-") mystack.subt();
    if(getIt == "/") mystack.div();
    if(getIt == "%") mystack.mod();
    if(getIt == "SUM") mystack.sumof();
    if(getIt == "R") mystack.reverse();
    if(getIt == "#") mystack.print();
    if(getIt == "$") mystack.clear();
    else {
      pushIt = atoi(getIt.c_str()); // I have no idea if this was
                                    //utilized correctly, feel free
     mystack.push(pushIt);          // to correct me here if not..
    }
   }
  while(getIt!="@"); // breaks on @
  return 0;
 }

Push、Pop 和 Top 运算符:

void Stack::push(const int& val){
  Node* newNode = new Node;
  newNode->data = val;
  if(!head){
    head = newNode;
    return;
  }
  newNode->next = head;
  head = newNode;
}


void Stack::pop(){
  if(!head)
    return;
  if(head->next == NULL){
    delete head;
    head = NULL;
    return;
  }
  Node* deleteIt = head;
  head = head->next;
  delete deleteIt;
  return;
}


const int& Stack::top() const throw(Oops) { //Oops returns
  if(head == NULL){                     // an error variable
    std::cout<<"ERROR!! : No values in the stack.";
  }      
  return head->data;
}
// I also don't know if I used the throw right here.. 

而且,以防我实际上在这里做错了......这是我的一个操作函数(+),其他的都是类似的编码。

void Stack::add(){
  int num1 = top();
  pop();
  int num2 = top();
  pop();
  int sum = num2+num1;
  push(sum);
  return;
}

谢谢!

4

1 回答 1

2

您的流量控制不正确。考虑当用户输入 a 时会发生什么+

if(getIt == "+") mystack.add();   // <== this happens
if(getIt == "-") mystack.subt();  // nope
if(getIt == "/") mystack.div();   // nope
// ... snip ... 
if(getIt == "$") mystack.clear(); // nope
else {                            // this else is associated ONLY with the 
                                  // previous if. As a result...
  pushIt = atoi(getIt.c_str());   // <== this happens too!
  mystack.push(pushIt);
}

您将 a 处理+为加法操作数数字 - 和atoi("+") == 0。问题是你所有的ifs 都是独立的,它们不应该是:

if (getIt == "+") ...
else if (getIt == "-") ...
else if (getIt == "/") ...
...
else {
    // handle int here
}
于 2015-04-20T02:28:58.537 回答