Implementar una pila usando una lista enlazada individualmente

Para implementar una pila utilizando el concepto de lista de enlace único, todas las operaciones de lista de enlace único se realizan en función de las operaciones de pila LIFO (último en entrar, primero en salir) y con la ayuda de ese conocimiento vamos a implementar una pila utilizando lista de enlace único. Usando listas enlazadas individualmente, implementamos la pila almacenando la información en forma de Nodes y necesitamos seguir las reglas de la pila e implementar usando Nodes de lista enlazada individualmente. Por lo tanto, debemos seguir una regla simple en la implementación de una pila que es el último en entrar, primero en salir y todas las operaciones se pueden realizar con la ayuda de una variable superior. Aprendamos cómo realizar operaciones Pop, Push, Peek, Display en el siguiente artículo. 
 

Una pila se puede implementar fácilmente usando la lista enlazada. En la implementación de pila, una pila contiene un puntero superior. que es la «cabeza» de la pila donde se empujan y sacan elementos al principio de la lista. El primer Node tiene nulo en el campo de enlace y el segundo enlace de Node tiene la dirección del primer Node en el campo de enlace y así sucesivamente y la dirección del último Node en el puntero «superior».
La principal ventaja de usar una lista enlazada sobre una array es que es posible implementar una pila que puede reducirse o crecer tanto como sea necesario. Al usar la array, se restringirá la capacidad máxima de la array, lo que puede provocar un desbordamiento de la pila. Aquí cada nuevo Node se asignará dinámicamente. por lo que el desbordamiento no es posible.
Operaciones de pila: 

  1. push() : inserta un nuevo elemento en la pila, es decir, simplemente inserta un nuevo elemento al comienzo de la lista enlazada.
  2. pop() : Devuelve el elemento superior de la pila, es decir, simplemente elimina el primer elemento de la lista enlazada.
  3. peek() : Devuelve el elemento superior.
  4. display(): Imprime todos los elementos en Stack.

Complete Interview Preparation - GFG

A continuación se muestra la implementación del enfoque anterior:  

C++

// C++ program to Implement a stack
//using singly linked list
#include <bits/stdc++.h>
using namespace std;
  
// Declare linked list node
  
struct Node
{
    int data;
    Node* link;
};
  
Node* top;
  
// Utility function to add an element
// data in the stack insert at the beginning
void push(int data)
{
      
    // Create new node temp and allocate memory in heap
    Node* temp = new Node();
  
    // Check if stack (heap) is full.
    // Then inserting an element would
    // lead to stack overflow
    if (!temp)
    {
        cout << "\nStack Overflow";
        exit(1);
    }
  
    // Initialize data into temp data field
    temp->data = data;
  
    // Put top pointer reference into temp link
    temp->link = top;
  
    // Make temp as top of Stack
    top = temp;
}
  
// Utility function to check if
// the stack is empty or not
int isEmpty()
{
    //If top is NULL it means that 
    //there are no elements are in stack
    return top == NULL;
}
  
// Utility function to return top element in a stack
int peek()
{
      
    // If stack is not empty , return the top element
    if (!isEmpty())
        return top->data;
    else
        exit(1);
}
  
// Utility function to pop top
// element from the stack
void pop()
{
    Node* temp;
  
    // Check for stack underflow
    if (top == NULL)
    {
        cout << "\nStack Underflow" << endl;
        exit(1);
    }
    else
    {
          
        // Assign top to temp
        temp = top;
  
        // Assign second node to top
        top = top->link;
  
        //This will automatically destroy 
        //the link between first node and second node
  
        // Release memory of top node
        //i.e delete the node
        free(temp);
    }
}
  
// Function to print all the
// elements of the stack
void display()
{
    Node* temp;
  
    // Check for stack underflow
    if (top == NULL)
    {
        cout << "\nStack Underflow";
        exit(1);
    }
    else
    {
        temp = top;
        while (temp != NULL)
        {
  
            // Print node data
            cout << temp->data << "-> ";
  
            // Assign temp link to temp
            temp = temp->link;
        }
    }
}
  
// Driver Code
int main()
{
      
    // Push the elements of stack
    push(11);
    push(22);
    push(33);
    push(44);
  
    // Display stack elements
    display();
  
    // Print top element of stack
    cout << "\nTop element is "
        << peek() << endl;
  
    // Delete top elements of stack
    pop();
    pop();
  
    // Display stack elements
    display();
  
    // Print top element of stack
    cout << "\nTop element is "
        << peek() << endl;
          
    return 0;
}

Java

// Java program to Implement a stack
// using singly linked list
// import package
import static java.lang.System.exit;
  
// Create Stack Using Linked list
class StackUsingLinkedlist {
  
    // A linked list node
    private class Node {
  
        int data; // integer data
        Node link; // reference variable Node type
    }
    // create global top reference variable global
    Node top;
    // Constructor
    StackUsingLinkedlist()
    {
        this.top = null;
    }
  
    // Utility function to add an element x in the stack
    public void push(int x) // insert at the beginning
    {
        // create new node temp and allocate memory
        Node temp = new Node();
  
        // check if stack (heap) is full. Then inserting an
        //  element would lead to stack overflow
        if (temp == null) {
            System.out.print("\nHeap Overflow");
            return;
        }
  
        // initialize data into temp data field
        temp.data = x;
  
        // put top reference into temp link
        temp.link = top;
  
        // update top reference
        top = temp;
    }
  
    // Utility function to check if the stack is empty or not
    public boolean isEmpty()
    {
        return top == null;
    }
  
    // Utility function to return top element in a stack
    public int peek()
    {
        // check for empty stack
        if (!isEmpty()) {
            return top.data;
        }
        else {
            System.out.println("Stack is empty");
            return -1;
        }
    }
  
    // Utility function to pop top element from the stack
    public void pop() // remove at the beginning
    {
        // check for stack underflow
        if (top == null) {
            System.out.print("\nStack Underflow");
            return;
        }
  
        // update the top pointer to point to the next node
        top = (top).link;
    }
  
    public void display()
    {
        // check for stack underflow
        if (top == null) {
            System.out.printf("\nStack Underflow");
            exit(1);
        }
        else {
            Node temp = top;
            while (temp != null) {
  
                // print node data
                System.out.printf("%d->", temp.data);
  
                // assign temp link to temp
                temp = temp.link;
            }
        }
    }
}
// main class
public class GFG {
    public static void main(String[] args)
    {
        // create Object of Implementing class
        StackUsingLinkedlist obj = new StackUsingLinkedlist();
        // insert Stack value
        obj.push(11);
        obj.push(22);
        obj.push(33);
        obj.push(44);
  
        // print Stack elements
        obj.display();
  
        // print Top element of Stack
        System.out.printf("\nTop element is %d\n", obj.peek());
  
        // Delete top element of Stack
        obj.pop();
        obj.pop();
  
        // print Stack elements
        obj.display();
  
        // print Top element of Stack
        System.out.printf("\nTop element is %d\n", obj.peek());
    }
}

Python3

'''Python supports automatic garbage collection so deallocation of memory
is done implicitly. However to force it to deallocate each node after use,
add the following code:
  
    import gc         #added at the start of program
    gc.collect()     #to be added wherever memory is to be deallocated
'''
  
class Node:
      
    # Class to create nodes of linked list
    # constructor initializes node automatically
    def __init__(self,data):
        self.data = data
        self.next = None
      
class Stack:
      
    # head is default NULL
    def __init__(self):
        self.head = None
      
    # Checks if stack is empty
    def isempty(self):
        if self.head == None:
            return True
        else:
            return False
      
    # Method to add data to the stack
    # adds to the start of the stack
    def push(self,data):
          
        if self.head == None:
            self.head=Node(data)
              
        else:
            newnode = Node(data)
            newnode.next = self.head
            self.head = newnode
      
    # Remove element that is the current head (start of the stack)
    def pop(self):
          
        if self.isempty():
            return None
              
        else:
            # Removes the head node and makes 
            #the preceding one the new head
            poppednode = self.head
            self.head = self.head.next
            poppednode.next = None
            return poppednode.data
      
    # Returns the head node data
    def peek(self):
          
        if self.isempty():
            return None
              
        else:
            return self.head.data
      
    # Prints out the stack     
    def display(self):
          
        iternode = self.head
        if self.isempty():
            print("Stack Underflow")
          
        else:
              
            while(iternode != None):
                  
                print(iternode.data,"->",end = " ")
                iternode = iternode.next
            return
          
# Driver code
MyStack = Stack()
  
MyStack.push(11) 
MyStack.push(22)
MyStack.push(33)
MyStack.push(44)
  
# Display stack elements 
MyStack.display()
  
# Print top element of stack 
print("\nTop element is ",MyStack.peek())
  
# Delete top elements of stack 
MyStack.pop()
MyStack.pop()
  
# Display stack elements
MyStack.display()
  
# Print top element of stack 
print("\nTop element is ", MyStack.peek()) 
  
# This code is contributed by Mathew George

C#

// C# program to Implement a stack 
// using singly linked list 
// import package
using System; 
  
// Create Stack Using Linked list 
public class StackUsingLinkedlist 
{ 
  
    // A linked list node 
    private class Node
    { 
        // integer data 
        public int data; 
          
        // reference variable Node type 
        public Node link; 
    } 
      
    // create global top reference variable 
    Node top; 
      
    // Constructor 
    public StackUsingLinkedlist() 
    { 
        this.top = null; 
    } 
  
    // Utility function to add 
    // an element x in the stack 
    // insert at the beginning 
    public void push(int x) 
    { 
        // create new node temp and allocate memory 
        Node temp = new Node(); 
  
        // check if stack (heap) is full. 
        // Then inserting an element
        // would lead to stack overflow 
        if (temp == null) 
        { 
            Console.Write("\nHeap Overflow"); 
            return; 
        } 
  
        // initialize data into temp data field 
        temp.data = x; 
  
        // put top reference into temp link 
        temp.link = top; 
  
        // update top reference 
        top = temp; 
    } 
  
    // Utility function to check if
    // the stack is empty or not 
    public bool isEmpty() 
    { 
        return top == null; 
    } 
  
    // Utility function to return
    // top element in a stack 
    public int peek() 
    { 
        // check for empty stack 
        if (!isEmpty()) 
        { 
            return top.data; 
        } 
        else
        { 
            Console.WriteLine("Stack is empty"); 
            return -1; 
        } 
    } 
  
    // Utility function to pop top element from the stack 
    public void pop() // remove at the beginning 
    { 
        // check for stack underflow 
        if (top == null)
        { 
            Console.Write("\nStack Underflow"); 
            return; 
        } 
  
        // update the top pointer to 
        // point to the next node 
        top = (top).link; 
    } 
  
    public void display() 
    { 
        // check for stack underflow 
        if (top == null) 
        { 
            Console.Write("\nStack Underflow"); 
            return; 
        } 
        else 
        { 
            Node temp = top; 
            while (temp != null) 
            { 
  
                // print node data 
                Console.Write("{0}->", temp.data); 
  
                // assign temp link to temp 
                temp = temp.link; 
            } 
        } 
    } 
} 
  
// Driver code 
public class GFG 
{ 
    public static void Main(String[] args) 
    { 
        // create Object of Implementing class 
        StackUsingLinkedlist obj = new StackUsingLinkedlist(); 
          
        // insert Stack value 
        obj.push(11); 
        obj.push(22); 
        obj.push(33); 
        obj.push(44); 
  
        // print Stack elements 
        obj.display(); 
  
        // print Top element of Stack 
        Console.Write("\nTop element is {0}\n", obj.peek()); 
  
        // Delete top element of Stack 
        obj.pop(); 
        obj.pop(); 
  
        // print Stack elements 
        obj.display(); 
  
        // print Top element of Stack 
        Console.Write("\nTop element is {0}\n", obj.peek()); 
    } 
}
  
// This code is contributed by 29AjayKumar

Javascript

<script>
// Javascript program to Implement a stack
// using singly linked list
// import package
  
// A linked list node
class Node
{
    constructor()
    {
        this.data=0;
        this.link=null;
    }
}
  
// Create Stack Using Linked list
class StackUsingLinkedlist
{
    constructor()
    {
        this.top=null;
    }
      
    // Utility function to add an element x in the stack
    push(x)
    {
        // create new node temp and allocate memory
        let temp = new Node();
   
        // check if stack (heap) is full. Then inserting an
        //  element would lead to stack overflow
        if (temp == null) {
            document.write("<br>Heap Overflow");
            return;
        }
   
        // initialize data into temp data field
        temp.data = x;
   
        // put top reference into temp link
        temp.link = this.top;
   
        // update top reference
        this.top = temp;
    }
      
     // Utility function to check if the stack is empty or not
    isEmpty()
    {
         return this.top == null;
    }
      
    // Utility function to return top element in a stack    
    peek()
    {
        // check for empty stack
        if (!this.isEmpty()) {
            return this.top.data;
        }
        else {
            document.write("Stack is empty<br>");
            return -1;
        }
    }
      
    // Utility function to pop top element from the stack
    pop() // remove at the beginning
    {
        // check for stack underflow
        if (this.top == null) {
            document.write("<br>Stack Underflow");
            return;
        }
   
        // update the top pointer to point to the next node
        this.top = this.top.link;
    }
      
    display()
    {
        // check for stack underflow
        if (this.top == null) {
            document.write("<br>Stack Underflow");
              
        }
        else {
            let temp = this.top;
            while (temp != null) {
   
                // print node data
                document.write(temp.data+"->");
   
                // assign temp link to temp
                temp = temp.link;
            }
        }
    }
}
  
// main class
  
// create Object of Implementing class
let obj = new StackUsingLinkedlist();
// insert Stack value
obj.push(11);
obj.push(22);
obj.push(33);
obj.push(44);
  
// print Stack elements
obj.display();
  
// print Top element of Stack
document.write("<br>Top element is ", obj.peek()+"<br>");
  
// Delete top element of Stack
obj.pop();
obj.pop();
  
// print Stack elements
obj.display();
  
// print Top element of Stack
document.write("<br>Top element is ", obj.peek()+"<br>");
  
// This code is contributed by rag2127
</script>

Producción:

44->33->22->11->
Top element is 44
22->11->
Top element is 22

La complejidad de tiempo para todas las operaciones push(), pop() y peek() es O(1) ya que no estamos realizando ningún tipo de recorrido sobre la lista. Realizamos todas las operaciones solo a través del puntero actual.

Complejidad espacial : O(n) donde n es el tamaño de la pila

Publicación traducida automáticamente

Artículo escrito por Rajput-Ji y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *