简体   繁体   中英

Stack implemantation in c++ using 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;
}

The Output of this code is 5 10 5 20 Stack is Empty.

Which is wrong output and the correct output is 5 10 20 Stack is Empty..

Anyone tell me why this errors occured.

The Refrence of the code :[ Implementation of stack using Templates and And Linked List in c++

No, the output is correct.

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

This displays the first 5 .

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

The 5 is still on the stack, so now this displays the 10 and then the 5 .

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

Now everything is removed, the 20 is added and the displayed, so this should just display 20 .

And then the empty stack is printed with

a.pop();
a.display();

So put together, it should display 5 10 5 20 Stack is Empty .

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 ... } } 

-->

void display() const
{
    if (!top) {
        std::cout << "Stack is empty!\n";
        return;
    }

    for(node *current = top; current; current = current->next)
        cout << current->data << ' ';
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM