Logo dell'Università di Catania: Siciliae Studium Generale 1434 Logo del Centro IPPARI, Programmazione
matite e gomma
Loghi istituzionali: Siciliae Studium Generale 1434, Centro ricerche IPPARI, Università di Catania, Facoltà di Scienze Matematiche, Fisiche, Naturali, Insegnamento di Programmazione

Sviluppo di ADT generici

Lezione 16 di Programmazione 2

Docente: Giuseppe Scollo

Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2007-8

Logo di Conformità WCAG-1 di Livello Tripla A, W3C-WAI Web Content Accessibility Guidelines 1.0 Validazione XHTML 1.0 Validazione CSS 2

Indice

  1. Sviluppo di ADT generici
  2. ADT parametrici e classi generiche
  3. l'ADT pila: interfaccia
  4. valutazione di un'espressione postfissa
  5. conversione da forma infissa a postfissa
  6. implementazione della pila con un array
  7. implementazione della pila con una lista
  8. esercizi

ADT parametrici e classi generiche

costruttori di tipo predefiniti quali l'array specificano in modo generico strutture dati omogenee perché sono parametrici in un tipo (parametro)

anche le classi definite nella Standard Template Library (STL) hanno lo stesso pregio

i template C++ permettono di definire ADT parametrici, nonché operazioni generiche nel tipo di oggetti a cui si applicano: la loro definizione non dipende dal tipo parametro

ecco, ad esempio, il codice per una generica operazione di scambio dei valori fra due argomenti dello stesso tipo (qualsiasi), passati per riferimento:

casi tipici importanti di classi generiche sono le classi contenitori, che specificano strutture dati omogenee, cioè collezioni di oggetti di uno stesso tipo (qualsiasi), dotate di operazioni tipiche di inserimento e rimozione di oggetti dal contenitore

l'ADT pila: interfaccia

un'importante classe contenitore è la pila, ingl. stack : sequenza finita, di lunghezza variabile, di dati omogenei, ad accesso sequenziale con disciplina LIFO

la pila è una struttura dati fondamentale:

per esplorare implementazioni diverse dell'ADT con diverse strutture dati, usiamo una direttiva #include per la parte privata anziché specificarla direttamente con l'interfaccia:

valutazione di un'espressione postfissa

problema: codificare una funzione C++ che, data una stringa che rappresenta un'espressione aritmetica (di tipo intero) in forma postfissa, ne restituisca il valore

soluzione: usare internamente una pila di interi per la valutazione dell'espressione

conversione da forma infissa a postfissa

problema: codificare una procedura C++ che converta in forma postfissa la stringa che rappresenta un'espressione aritmetica (di tipo intero) in forma infissa in parentesi

soluzione: uso di una pila di caratteri per differire il posizionamento degli operatori nella forma postfissa

implementazione della pila con un array

strutture dati private stack-private.h:

implementazione delle operazioni stack.c++ :

implementazione della pila con una lista

strutture dati private stack-private.h:

implementazione delle operazioni stack.c++:

esercizi

  1. codificare una funzione C++ che calcoli il valore di una stringa che rappresenta un'espressione aritmetica (di tipo intero) in forma infissa in parentesi
  2. codificare una procedura C++ che, data una stringa che rappresenta una espressione aritmetica (di tipo intero) in forma postfissa, produca la stringa dell'equivalente forma infissa in parentesi, usando una pila
  3. esercizio 4.22 del testo (Sedgewick, 2003), a p.158: modificare l'interfaccia della pila sostituendo empty con count, che restituisce il numero di elementi nella pila, e implementarla usando sia array che liste concatenate
  4. esercizi 4.23 e 4.24 del testo (Sedgewick, 2003), a p.158: modificare le due implementazioni della pila viste sopra in modo che si invochi una funzione membro error() quando il client invoca pop su una pila vuota o push su una pila piena