• Non ci sono risultati.

Strutture Dati Astratte

N/A
N/A
Protected

Academic year: 2021

Condividi "Strutture Dati Astratte"

Copied!
9
0
0

Testo completo

(1)

Strutture Dati Astratte

(2)

Algoritmi e Strutture Dati

Molti algoritmi fanno usostrutture dati:

I persfruttare i serviziche queste mettono a disposizione;

I perriversare su di esse la complessit`adi alcune operazioni (senza doversi interessare della loro implementazione);

I per gestire dati secondo determinate politiche.

Inoltre, lestesse strutture dati possono essereutilizzate da pi`u algoritmi:

Esempio: La struttura codapu`o essere utilizzata per:

I gestire le richieste ad una stampante (coda di stampa);

I regolare l’esecuzione di pi`u processi (coda di priorit`a);

I memorizzare la frontiera in unavisita in ampiezza di un grafo;

(3)

Strutture Dati e Astrazione

Astrazione dei dati: Separazione del concetto “dato” dalla sua rappresentazione.

“Un’astrazione deve denotare le caratteristiche essenziali di un oggetto contraddistinguendolo da tutti gli altri oggetti e fornendo,

in tal modo, dei confini concettuali ben precisi relativamente alla prospettiva dell’osservatore”(Grady Booch).

Strutture Dati Astratte (ADT): strutture dati definite a prescindere dalla loro implementazione.

Opacit`a dei dati: ogni programma pu`o accedere alla struttura esclusivamentetramite i servizi (concetto diinterfaccia).

(4)

L’ADT pila di interi

Esempio: Vogliamo definire una pila di interi:

typedef struct STACK { ... }* Stack;

Qualiservizivogliamo dal tipoStack?

I Stack init( void ); inizializza una nuova pila;

I void push( Stack, int ); inserisce un intero nella pila;

I int pop( Stack ); toglie l’ultimo intero inserito e lo resituisce;

I int isEmpty( STACK * );dice se la pila `e vuota;

Tali servizi identificano l’interfaccia della struttura.

Vediamo una possibile soluzione: quella in C.

(5)

Strutture Dati Astratte

...in C

(6)

L’interfaccia `e un filestack.h. Serve definire un tipo Stack.

/* stack.h */

typedef struct STACK { int *store;

int top;

}* Stack;

Stack init( void );

void push( Stack, int );

int pop( Stack );

int isEmpty( Stack );

Non `e un ADT!! Non si implementano le funzioni, ok, ma si suppone cheSTACK sia implementato come un vettore!

Come risolvo il problema della rappresentazione del tipo STACK?

(7)

Dichiaro un tipo “puntatore all’etichettastruct STACK”.

/* stack.h */

typedef struct STACK* Stack;

Stack init( void );

void push( Stack, int );

int pop( Stack );

int isEmpty( Stack );

Posso definire la strutturaSTACKnel file di implementazione!

Ora siamo di fronte ad un ADT.

(8)

L’ADTStack pu`o essere implementato tramite vettore nel file di implementazione:

/* stack.c */

#include <stdio.h>

#include <stdlib.h>

#include ‘‘stack.h’’

#define MAX DIM 100

struct STACK { int store[MAX DIM]; int top; };

Stack init( void ) { ... }

void push( Stack s, int i ) {...}

int pop( Stack s ) { ... } int isEmpty( Stack s ) { ... }

Posso definire la strutturaSTACKnel file di implementazione!

Ora siamo di fronte ad un ADT.

(9)

Esempio di ADT per sorting

Nell’esempio visto a laboratorio, vediamo unaADT,Item, per memorizzare oggetti generici su cui fare sorting.

Servizi diItem:

I crea un nuovoItem (in modo casuale, per i test);

I dati dueItem, dimmi l’ordine (ordinamento totale);

I dato unItem, scrivilo sullo schermo;

In questo modo, possiamo riscrivere tutti gli algoritmi che ordinano vettori (diItem) astraendo da quali oggetti questi Item

rappresentano e da quale ordinamento sia definito su questi oggetti.

Riferimenti

Documenti correlati

Si scriva una procedura Pascal, basata sulla ricerca binaria, per individuare in tempo O(log n) l’unico intero dell’intervallo 1..n+1 che non compare in V.... Si scriva

Esistono due classi di memoria: automatica e statica La classe di memoria automatica è relativa a quegli oggetti locali ad un blocco (funzione o programma) che viene liberata

E responsabilità del programmatore controllare che il numero ed il tipo degli argomenti passati ad una funzione corrisponda con quanto specificato nella dichiarazione della

L Insertion Sort è uno algoritmo di ordinamento molto efficiente per ordinare un piccolo numero di elementi. L idea di ordinamento è quella che potrebbe usare un persona

L’array A[p…r] viene “suddiviso” in due sotto- array “non vuoti” A[p… q] e A[q+1…r] in cui ogni elemento di A[p…q] è minore o uguale ad ogni elemento

Lo scopo del gioco è quello di trasferire i dischi dal paletto di sinistra a quello di destra, senza mai mettere un disco su un altro di dimensione più piccola4. Regole

Si noti che l ordine in cui i piatti sono tolti dallo stack è inversa all ordine in cui essi sono stati inseriti nello stack, visto che solo il top dello stack è accessibile..

Nella situazione iniziale, tutti gli elementi sono posti nello Stack H dove l elemento al Top è la testa (Head) della coda, mentre quello al Bottom rappresenta la fine