In questa lezione svilupperemo un semplice esercizio sull’uso della pila in C.

Creiamo dunque un programma per la gestione di una pila che permette di inserire dei valori, eliminarli, stamparli e cancellarli tutti in una volta.

Serviranno dunque le funzioni:

Push per l’inseriemento dei dati;

Pop per l’estrazione dei dati;

Clear per cancellare tutti i dati della pila;

Banner Pubblicitario

Print per stampare tutti i dati dall’elemento in alto a quello in basso.

Per la risoluzione del seguente problema, abbiamo assegnato all’indice testa il valore iniziale 0. Quindi nel caso in cui la testa sia uguale a zero vuol dire che la pila è vuota.

Nell’operazione Push la variabile testa viene incrementata di 1, invece nell’operazione Pop la variabile testa viene decrementata di 1.

Si poteva anche operare assegnando a testa il valore MAX anzichè zero e ragionare in maniera analoga.

Ecco dunque il semplice algoritmo che realizza le operazioni di inserimento ed estrazione di un elemento in un pila in c. Inoltre implementeremo le operazioni di stampa e svuotamento della pila.

Notate come in questa prima soluzione, sviluppata principalmente a scopo didattico, facciamo uso delle variabili globali.

Banner pubblicitario
#include <stdio.h>

#define MAX 3

int testa;
int Pila[MAX];

int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    printf("\n" );
    printf("\n1 -> Aggiungi un dato" );
    printf("\n2 -> Estrai un dato");
    printf("\n3 -> Svuota pila");
    printf("\n4 -> Stampa pila");
    printf("\n5 -> Esci");
    printf("\n" );
    printf("\nEffettua una scelta: " );
    scanf("%d", &selezione );
    }
    while (selezione<1 || selezione>5);
  return selezione;
}

void Push() {
	int n;
	
	if(testa==MAX) 
	         printf("\n -> Pila piena" );
	else {
		 printf("\nInserisci un dato: " );
		 scanf("%d", &n);
		 Pila[testa++]=n;
	}		
}

void Pop() {
	if(testa==0) 
	     printf("\n - Pila vuota" );
	else 
	    printf("%d", Pila[--testa]);	
}

void Clear() {
	testa=0;
	printf("\n -> Pila svuotata" );			
}

void Print() {
	int i;
	if(testa==0) 
	       printf("\n -> Pila vuota" );
	else 
              for(i=testa-1;i>=0;i--)	
                  printf("indice i: %d elemento %d\n", i, Pila[i]);			

}

int main(){
	int scelta;
	
	while((scelta=menu_scelta())!=5){
             switch(scelta){
                   case 1: 
			Push();
                        break;
                   case 2:
			Pop();
               	        break;
                   case 3:
			Clear();
            	        break;
                   case 4: 
			Print();
			break;
	        case 5: 
		        break;
             }
    }             
    return 0;
}

N.B Avremmo anche potuto scrivere nel Push:

	....
        Pila[testa]=n;
        testa++;
        ....

E nel Pop:

         .....
         else {
            testa--;
	    printf("%d", Pila[testa]);
         }
        .....

Questa soluzione, come abbiamo già detto, fa uso delle variabili globali, ma come sappiamo non sempre è bene usarle. Nella prossima lezione implementeremo invece un metodo che non le utilizza. Quindi passeremo i parametri alle funzioni Push(), Pop(), Clear() e Print().

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C