使用链表在c ++中进行堆栈实现

Aj *_*les 2 c++ stack linked-list

#include<iostream>
#include<cstdlib>
using namespace std;

 struct node
 {
   int data;   //data
   node *next; //link
 };

 class stack // stack using linked list
 {
  public:
  node *top; // top element of stack

  public:
   stack()
   {
     top= NULL;
   }

   void push(int value)
   {
     node *temp  = new node; // create a new node
     temp-> data = value;
     temp-> next = NULL;
   if(top==NULL)          //  stack is empty
    {
      top=temp;
      temp=NULL;
    }
    else
    {
      temp-> next = top;
      top=temp;
      temp=NULL;
    }
  }
  //template <class X>
  void pop()
  {
    if(top==NULL)
    {
      cout<<"\nStackOverflow "<<endl;
      cout<<"Program Terminated "<<endl;
      exit (0);
    }
    else
    {
      top=top->next;
    }

  }

  void display()
  {

    node *temp=new node;
    temp=top;

    while(temp!=NULL)
    {
      cout<<temp->data<<" ";
      temp = temp-> next;
    }
    while(top==NULL)

     { 
        cout<<"\nStack is Empty "<<endl;  
        exit (0);

     }



  }
};

int main()
{
   stack a;

  a.push(5);
  a.display();
  a.push(10);
  a.display();
  a.pop();
  a.pop();
  a.push(20);
  a.display();
  a.pop();
  a.display();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出为5 10 5 20堆栈为空.

输出错误,正确的输出是5 10 20堆栈是空的..

任何人都告诉我为什么会出现这种错误.

代码的参考:[ 在c ++中使用模板和链接列表实现堆栈

Bla*_*aze 6

不,输出是正确的.

a.push(5);
a.display();
Run Code Online (Sandbox Code Playgroud)

这显示了第一个5.

a.push(10);
a.display();
Run Code Online (Sandbox Code Playgroud)

5仍然是在栈上,所以现在这显示10,然后5.

a.pop();
a.pop();
a.push(20);
a.display();
Run Code Online (Sandbox Code Playgroud)

现在一切都被删除,20添加和显示,所以这应该只显示20.

然后打印空堆栈

a.pop();
a.display();
Run Code Online (Sandbox Code Playgroud)

所以放在一起,它应该显示出来5 10 5 20 Stack is Empty.

  • 不,'5`被正确打印两次.你将`5`放在堆栈上并在将'5`从堆栈中弹出之前调用`display()`两次,因此它会被打印两次. (3认同)
  • @AkkiêThakur我猜你认为显示应该显示最后一个项目被推入堆栈,但它不会显示整个堆栈. (2认同)