La Pila in Java: Cos’è, Come Funziona e Perché è Utile

Immagina di essere in fila alla cassa del supermercato. L’ultimo che arriva è l’ultimo che viene servito. Ora capovolgi la logica: pensa a una pila di piatti in una mensa. Il primo piatto che prendi è quello che è stato messo per ultimo. Ecco, questa è l’essenza della struttura dati Stack (Pila) in Java!

Ma perché dovresti interessarti a una cosa del genere? Beh, se programmi (o vuoi iniziare), sappi che una pila è usata ovunque: nella gestione dell’esecuzione delle funzioni, nell’annullamento delle azioni in un editor di testo, nell’algoritmo di navigazione di un browser, e persino nei videogiochi.

Cos’è una Pila in Java?

Una pila è una struttura dati che segue il principio LIFO (Last In, First Out), ovvero l’ultimo elemento inserito è il primo a essere rimosso. In Java, puoi implementare una pila in vari modi:

  • Utilizzando la classe Stack<E> di Java
  • Usando una LinkedList
  • Implementandola manualmente con un array o una lista concatenata

Metodi Principali della Classe Stack<E>

La classe Stack<E> fa parte del package java.util ed estende Vector<E>. Ecco i metodi principali:

  • push(E item): Inserisce un elemento in cima alla pila.
  • pop(): Rimuove e restituisce l’elemento in cima alla pila.
  • peek(): Restituisce l’elemento in cima senza rimuoverlo.
  • isEmpty(): Verifica se la pila è vuota.
  • search(Object o): Restituisce la posizione di un elemento nella pila (se presente).

Esempio di Utilizzo:

import java.util.Stack; public class StackExample { public static void main(String[] args) { Stack<Integer> pila = new Stack<>(); pila.push(10); pila.push(20); pila.push(30); System.out.println("Elemento in cima: " + pila.peek()); System.out.println("Elemento rimosso: " + pila.pop()); System.out.println("La pila è vuota? " + pila.isEmpty()); } }

Applicazioni nella Vita Reale

Vediamo ora qualche esempio concreto di utilizzo delle pile nel mondo reale.

Ogni volta che premi Ctrl + Z per annullare un’azione in un editor di testo, stai usando una pila! Le modifiche vengono salvate in uno stack: l’ultima modifica fatta è la prima a essere annullata.

Esempio pratico:

import java.util.Stack; public class UndoRedo { private Stack<String> undoStack = new Stack<>(); private Stack<String> redoStack = new Stack<>(); public void scrivi(String testo) { undoStack.push(testo); redoStack.clear(); } public String undo() { if (!undoStack.isEmpty()) { redoStack.push(undoStack.pop()); } return undoStack.isEmpty() ? "" : undoStack.peek(); } public String redo() { if (!redoStack.isEmpty()) { undoStack.push(redoStack.pop()); } return undoStack.isEmpty() ? "" : undoStack.peek(); } }

Quando una funzione chiama se stessa, Java usa uno stack di chiamate per memorizzare lo stato attuale dell’esecuzione. Ad esempio, la funzione di calcolo del fattoriale si basa su questo principio:

public static int fattoriale(int n) { if (n == 1) return 1; return n * fattoriale(n - 1); }

Ad ogni chiamata, il valore di n viene memorizzato nello stack finché non si raggiunge n == 1, poi si inizia a “tornare indietro”, moltiplicando i valori salvati.

Quando visiti un sito web, il browser salva la cronologia di navigazione in due pile: una per andare indietro, una per andare avanti.

Implementazione semplice:

import java.util.Stack; public class BrowserNavigation { private Stack<String> backStack = new Stack<>(); private Stack<String> forwardStack = new Stack<>(); public void visitaPagina(String url) { backStack.push(url); forwardStack.clear(); } public String back() { if (!backStack.isEmpty()) { forwardStack.push(backStack.pop()); } return backStack.isEmpty() ? "Home" : backStack.peek(); } public String forward() { if (!forwardStack.isEmpty()) { backStack.push(forwardStack.pop()); } return backStack.isEmpty() ? "Home" : backStack.peek(); } }

Costruire un’App Basata su Stack

Se vuoi realizzare un’app che sfrutta una pila, potresti creare un gestore di cronologia azioni in un’app per prendere appunti. Potresti usare una Stack<String> per salvare ogni modifica e permettere all’utente di tornare indietro o avanti tra le versioni del testo.

Tecnologie consigliate:

  • Java con JavaFX per la UI
  • SQLite se vuoi salvare la cronologia
  • Stack per gestire le azioni

Le pile sono ovunque: nel codice dei browser, negli editor di testo, nelle chiamate ricorsive. La prossima volta che premi “annulla” su un’app, ricorda che dietro c’è una pila che lavora per te!

Vuoi provare? Crea una semplice app con JavaFX che gestisce una pila di operazioni e gioca con push() e pop(). Ti accorgerai di quanto siano utili!

Se hai dubbi o vuoi approfondire, scrivimi nei commenti: quale altra applicazione delle pile trovi interessante?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Translate »
Torna in alto