Pila in Java

Una pila è un tipo di dato strutturato che segue la strategia LIFO (Last In, First Out), il che significa che l’ultimo elemento inserito nella pila sarà il primo a essere rimosso. È una struttura di dati lineare che utilizza due operazioni principali: push e pop. La funzione push viene utilizzata per inserire un nuovo elemento in cima alla pila, mentre la funzione pop viene utilizzata per rimuovere l’elemento in cima alla pila.

Una pila è utile in molte situazioni, come ad esempio per la risoluzione di espressioni matematiche o per l’implementazione di algoritmi ricorsivi. In questi casi, gli elementi vengono inseriti nella pila al momento della chiamata ricorsiva e vengono rimossi dalla pila quando si ritorna dalla chiamata ricorsiva.

In sintesi, una pila è una struttura di dati lineare che segue la strategia LIFO e utilizza le operazioni push e pop per gestire l’inserimento e la rimozione di elementi.

Costruire la propria classe Stack

Ecco un esempio di come creare una pila da zero in Java:

public class Stack {
    int[] elements;
    int size;
    
    public Stack(int capacity) {
        elements = new int[capacity];
        size = 0;
    }
    
    public void push(int element) {
        if (size == elements.length) {
            throw new IllegalStateException("La pila è piena!");
        }
        elements[size++] = element;
    }
    
    public int pop() {
        if (size == 0) {
            throw new IllegalStateException("La pila è vuota!");
        }
        return elements[--size];
    }
    
    public boolean isEmpty() {
        return size == 0;
    }
    
    public int size() {
        return size;
    }
}

Classe Stack

Ecco un esempio di implementazione utilizzando java.util.Stack:

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        // Aggiungi elementi alla pila
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // Stampa il contenuto della pila
        System.out.println("Elementi nella pila: " + stack);

        // Rimuovi l'elemento in cima alla pila
        int removedElement = stack.pop();
        System.out.println("Elemento rimosso: " + removedElement);

        // Verifica se la pila è vuota
        System.out.println("La pila è vuota: " + stack.isEmpty());
    }
}

Utilizzo della classe ArrayDeque

Ecco un esempio di implementazione utilizzando java.util.ArrayDeque:

import java.util.ArrayDeque;

public class StackExample2 {
    public static void main(String[] args) {
        ArrayDeque<Integer> stack = new ArrayDeque<>();

        // Aggiungi elementi alla pila
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // Stampa il contenuto della pila
        System.out.println("Elementi nella pila: " + stack);

        // Rimuovi l'elemento in cima alla pila
        int removedElement = stack.pop();
        System.out.println("Elemento rimosso: " + removedElement);

        // Verifica se la pila è vuota
        System.out.println("La pila è vuota: " + stack.isEmpty());
    }
}

Casi di utilizzo delle pile

Le pile sono utilizzate in molte situazioni diverse e alcuni degli usi più comuni sono:

  1. Risoluzione di espressioni matematiche: le pile sono spesso utilizzate per risolvere espressioni matematiche in notazione polacca inversa.
  2. Algoritmi ricorsivi: le pile sono utilizzate per implementare algoritmi ricorsivi che richiedono di tenere traccia delle chiamate ricorsive correnti.
  3. Navigazione del browser web: le pile sono utilizzate per tenere traccia della navigazione del browser web, in modo che l’utente possa tornare alla pagina precedente premendo il pulsante “Indietro”.
  4. Undo/Redo: le pile sono utilizzate per implementare la funzionalità Undo/Redo in molti software, dove gli utenti possono annullare o ripetere le azioni precedenti.
  5. Controllo di sistemi operativi: le pile sono utilizzate nei sistemi operativi per gestire le chiamate del sistema e il controllo dei processi.

In sintesi, le pile sono un tipo di dato strutturato molto utile che viene utilizzato in molti diversi contesti, sia in ambito accademico che in ambito industriale.

La mia repository GitHub sulla lezione

Lezioni sul linguaggio Java

Pubblicato da Carlo Contardi

Carlo Contardi, docente di informatica e sviluppatore Full Stack, condivide la sua passione per la programmazione e l’informatica attraverso il suo blog Space Coding. Offre preziosi consigli e soluzioni pratiche a chi vuole imparare a programmare o migliorare le proprie abilità. 🚀👨‍💻

Translate »