![]() ![]() |
|
Le pile (stack)
sono un tipo di dati astratto molto semplice, ma dal diffuso impiego.
Intuitivamente, una pila è un sequenza di zero
o più elementi
in cui è possibile aggiungere o togliere elementi soltanto ad un estremo della sequenza, detto cima (top) della pila. Politica di accesso: [ultimo elemento inserito, primo elemento rimosso] Esempi: una pila di piatti, un tubetto di pastiglie, ... |
![]() ![]() |
|
Di solito una pila viene rappresentata graficamente
come una sequenza verticale di "caselle" contenenti i suoi elementi. La
casella più in alto è la cima (top).
|
|||||||
![]() ![]() |
|
La specifica del TDA pila comprende normalmente
le seguenti operazioni:
|
![]() ![]() |
|
La seguente interfaccia
definisce il tipo di dati astratto Stack
|
![]() ![]() |
|
Il significato dei metodi (la loro semantica) viene spiegato (in modo informale) dai commenti al codice, leggibili anche con un browser grazie a javadoc:
Quindi:
Si noti il metodo lancia un'eccezione se viene eseguito da una pila vuota. L'eccezione EmptyStackException è definita all'interno del package lab2. |
![]() ![]() |
|
Supponiamo di voler scrivere un algoritmo che
riceva in ingresso una espressione aritmetica, e verifichi il corretto
bilanciamento delle parentesi.
Se le parentesi sono solo tonde, basta utilizzare una variabile intera (un contatore).
Se le parentesi possono essere graffe, quadre o tonde,
è facile convincersi che non bastano uno o più contantori,
ma occorre ricordare la sequenza delle parentesi aperte. Il seguente algoritmo
risolve il problema usando una pila:
|
![]() ![]() |
|
Vediamo il codice Java. Definiamo prima una classe
Bracket,
che funga da contenitore per char, ed offra
un ulteriore metodo utile.
|
![]() ![]() |
|
Ed ecco infine il cui metodo
statico checkBalPar della classe BalPar,
che implementa l'algoritmo descritto in precedenza. Può essere provato
con la classe TestBalPar
|
![]() ![]() |
|
![]() ![]() |
1) Si definisca una classe con la seguente struttura:
Soluzione:
Si osservi che quando si dice "La pila originale non viene modificata"
si intende che il suo stato deve essere ripristinato prima della fine del
metodo.
2) Si fornisca una implementazione della seguente
classe astratta
dove il metodo swap deve restituire un pila ottenuta da quella in scambia scambiando i primi due elementi, senza alterare la pila scambia. Se scambia contiene meno di due elementi, swap deve lanciare un'eccezione EmptyStackException. 3) Si definisca una classe con la seguente
struttura
dove il metodo clone non deve alterare la pila originale. |