使用链接列表的C ++中的堆栈实现

时间:2018-09-28 07:34:55

标签: c++ linked-list stack

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

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

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

任何人都告诉我为什么会发生此错误。

代码参考:[{Implementation of stack using Templates and And Linked List in c++

2 个答案:

答案 0 :(得分:6)

否,输出正确。

a.push(5);
a.display();

这将显示第一个5

a.push(10);
a.display();

5仍在堆栈中,因此现在显示10,然后显示5

a.pop();
a.pop();
a.push(20);
a.display();

现在所有内容都已删除,20已添加并显示出来,因此应该只显示20

然后用

打印空堆栈
a.pop();
a.display();

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

答案 1 :(得分:4)

<section class="section">
  <div class="columns">
    <div class="column">
        <!-- column 1 -->
    </div>
    <div class="column">
        <!-- column 2 -->
    </div>
  </div>
</section>

a.push(5);     // Stack:  5
a.display();   // Output: new: 5
a.push(10);    // Stack:  10 5
a.display();   // Output: old: 5 new: 10 5
a.pop();       // Stack:  5
a.pop();       // Stack:  empty
a.push(20);    // Stack:  20
a.display();   // Output: old: 5 10 5 new: 20
a.pop();       // Stack:  empty
a.display();   // Output: old: 5 10 5 20 new: 

->

stack()
{
    top= NULL;  // use initializ list instead of assignment
                // in constructors body
}

stack() : top{ nullptr } {}

->

void pop()
{
    if (top == NULL)
    {
        cout << "\nStackOverflow " << endl;
        cout << "Program Terminated " << endl;
        exit(0);  // don't use exit() in C++ if there are other ways!
    }
    else
    {
        top = top->next; // the memory top pointed to
                         // before the assignment leaks!
    }
}

void pop()
{
    if (!top) {
        cout << "Pop on empty stack!\n";
        return;
    }

    node *old_top = top;
    top = top->next;
    delete old_top;
}

->

void display()
{
    node *temp = new node;  // no need to allocate a node in a
                            // function that should only make output
    temp = top;             // the memory temp points to before the
                            // assignment leaks

    while (temp != NULL)
    {
        cout << temp->data << " ";
        temp = temp->next;
    }
    while (top == NULL)  // why a loop?
    {
        cout << "\nStack is Empty " << endl;
        exit (0);   // again ...
    }
}