Schiavone & Scalas 2
In informatica, il termine stack o pila viene usato in diversi contesti per riferirsi a strutture dati le cui modalità d'accesso seguono una politica LIFO (Last In First Out) più in generale la pila è una struttura dati lineare a cui si può accedere soltanto mediante uno dei suoi capi per inserire(PUSH) e per estrarre(POP) dati. Schiavone & Scalas3 Menù
Pila Sequenziale: sequenza di locazioni adiacenti in un vettore; segue una politica LIFO per cui il primo elemento inserito è anche il primo ad essere estratto. Si inserisce sempre in testa. Quando inserisco un elemento eseguo Push e quando ne estraggo uno eseguo un’operazione di Pop. SequenzialePushPop Schiavone & Scalas4 Menù
Concatenata: successioni di nodi collegato tra loro tramite puntatori dove l’ultimo nodo non ha successori. Si accede tramite un puntatore di testa e le operazioni di inserimento ed estrazione avvengono solo in testa alla struttura dati. Concatenata Schiavone & Scalas5 Menù
Sequenziale Schiavone & Scalas6 top top 0 pila vuota top max pila piena Menù
Concatenata Schiavone & Scalas7 PILA testa info Menù
Schiavone & Scalas8 Push 7 Push 15 Push 5Push 10 Pop Menù
Schiavone & Scalas9 Per inserire un elemento nella Pila è importante effettuare un’operazione di Push. Con questa operazione il dato inserito si troverà alla testa dello Stack e ad ogni operazione di Push il puntatore verrà incrementato 1.Controllare che la pila non sia Piena *IsFull* 2.Incrementa il puntatore 3.Inserimento di un elemento (Push) Menù
Schiavone & Scalas10 Per estrarre un elemento nella Pila è importante effettuare un’operazione di Pop. Con questa operazione il dato da estrarre si dovrà trovare alla testa dello Stack e ad ogni operazione di Pop il puntatore verrà decrementato 1.Controllare che la pila non sia Vuota *IsEmpty* 2.Estrarre l’elemento (Pop) 3.Decrementare Menù
Analisi Schiavone & Scalas11 Il programma comincia presentando un menù dove vi si possono effettuare 5 scelte che sono le seguenti: 1.inserimento elementi 2.stampa elementi 3.somma elementi 4.Pop 5.ESCI Con la prima scelta viene chiesto all’utente il numero di elementi che vuole inserire <<ne<<, dopo di che l’utente inserirà gli elementi uno alla volta. Effettuando la seconda scelta l’utente potrà visualizzare la stampa degli elementi pre-inseriti. Con la terza scelta verrà effettuata la somma algebrica degli elementi della Pila e dopo di che verrà visualizzata la somma degli elementi. Con la quarta scelta verrà estratto l’ultimo nodo inserito e richiamando la seconda funzione di stampa si potranno visualizzare gli elementi della Pila privi dell’elemento estratto. Menù
Analisi dei dati Schiavone & Scalas12 VARIABILEDESCRIZIONETIPOI/O/A SCÈ la variabile che serve per effettuare la scelta nel menù intI NEÈ il numero di elementiintI IÈ il contatore del forintI P1È la pilaPilaI/O NÈ il nodoNodoI INFOÈ il campo del nodo dove viene inserita l’informazione IntI Menù
Schiavone & Scalas 13 Flow Chart Menù
Schiavone & Scalas14 Menù
Schiavone & Scalas15 Menù
Codice Schiavone & Scalas16 Menù #include <<<<<struct<<<<< struct Nodo { int Info; Nodo *Next; }; struct Pila { Nodo *Testa; }; <<<<<<prototipi<<<<<<< void Crea(Pila &); int Testvuota(Pila); Nodo *Pop(Pila &); void Push(Pila &,Nodo *); void Stampa(Pila &); int Somma(Pila &); void main() { int sc,ne; clrscr(); Pila P1; Nodo *Temp; int Info; Crea(P1); do{ clrscr(); printf("MENU"); gotoxy(1,2); printf("1)inserimento elementi"); gotoxy(1,3); printf("2)stampa elementi"); gotoxy(1,4); printf("3)somma elementi"); gotoxy(1,5); printf("4)Pop"); gotoxy(1,6); printf("5)ESCI");
Schiavone & Scalas17 Menù switch(sc){ case 1: clrscr(); printf("quanti elementi vuoi inserire?"); scanf("%d",&ne); for(int i=1;i<=ne;i++) { Temp=new Nodo; printf("inserisci il %d ø elemento: ",i); scanf("%d",&Temp->Info); Temp->Next=NULL; Push(P1,Temp); } break; case 2: Stampa(P1); getch(); break; case 3: Stampa(P1); printf("Somma elementi= %d ",Somma(P1)); getch(); break; case 4: Nodo *Ntemp=Pop(P1); delete Ntemp; gotoxy(1,5); break; default: break; } }while(sc!=5); } <<<<<<Crea pila vuota<<<<<<< void Crea(Pila&P) { P.Testa=NULL; } <<<<<<verifica se la pila è vuota<<<<<< int TestVuota(Pila P) { getch(); return(P.Testa==0); }
Schiavone & Scalas18 <<<<<estrai un nodo POP<<<< Nodo*Pop(Pila&P) { Nodo*N=NULL; if(!TestVuota(P)) { N=P.Testa; P.Testa=(P.Testa)->Next; N->Next=NULL; } else printf("pila underflow"); return(N); } <<<<<inserisce un elemento PUSH<<< void Push(Pila &P,Nodo *N) { N->Next=P.Testa; P.Testa=N; } <<<<Stampa<<<<<<<<<<<<< void Stampa(Pila &P) { Nodo *Temp=P.Testa; while(Temp!=NULL) { printf("%d\n",Temp->Info); Temp=Temp->Next; }} Menù <<<<<somma degli elementi<<< int Somma(Pila &P) { int somma=0; Nodo*Temp=P.Testa; while(Temp!=NULL) { somma=somma+Temp->Info; Temp=Temp->Next; } return(somma); }
Schiavone & Scalas19 Menù