import java.util.ArrayList; // La pila ('stack' in inglese) e` una struttura-dati // assolutamente fondamentale. Per esempio, gestire // le chiamate di procedura nel supporto run-time di // un qualsiasi linguaggio di programmazione che // fornisca la ricorsione, richiede l'impiego // di una pila, della quale il programmatore puo` non // essere affatto consapevole. // // Vediamo qui un'implementazione delle operazioni // basilari della Pila (push-pop-top-empty), ove le // entita` impilabili sono generici Object. class Pila { // =========== CAMPI DI ESEMPLARE ===================== private ArrayList pila; // indispensabile private int tagliaMax = 0; // opzionale // =========== METODI COSTRUTTORI ================== // Uno dei costruttori non pone restrizioni di // taglia, l'altro si`. public Pila() { pila = new ArrayList(); pila.add( null ); } public Pila(int taglia) throws Trabocco { this(); if ( taglia < 0 ) throw new Trabocco( tagliaMax ); tagliaMax = taglia+1; } // =========== ALTRI METODI ======================== // ----------- METODI MODIFICATORI ----------------- // Inserimento e cancellazione: // Entrambi operano solo sulla sommita` della pila. public void push( Object el ) throws Trabocco { // aggiungi in cima if ( pila.size() == tagliaMax ) throw new Trabocco( tagliaMax ); pila.add(0, el); } // ------------------------------------------------- public Object pop() { // fornisci, rimuovendolo, // l'elemento che sta in cima return (this.empty()) ? null : pila.remove( 0 ); } // ----------- METODI DI ACCESSO ------------------- // Uno e` strettamente analogo a 'pop', l'altro // effettua una banale verifica. public Object top() { // fornisci l'elemento // apicale, senza rimuoverlo return (this.empty()) ? null : pila.get( 0 ); } // ------------------------------------------------- public boolean empty() { // test di pila-vuota return pila.size() == 1; } // ----------- METODO SOVRASCRITTO ----------------- public String toString() { // probabilmente destinata alla stampa String testo = "pila = "; for( Object el : pila ) testo += (el == null) ? "\n" : "\t" + ((el instanceof String) ? el: (el instanceof Integer || el instanceof Character) ? el.toString(): (el instanceof String[]) ? perStampa( (String[]) el ): "???"); return testo; } public String perStampa( String[] elenco ) { String testo = "["; for (String voce : elenco ) testo += voce + " "; return testo + "]"; } }