push e pop?

Salve a tutti qualcuno potrebbe spiegarmi in cosa consistono le operazioni di push e pop svolte dallo stack pointer?

3 risposte

Classificazione
  • exProf
    Lv 7
    3 sett fa

    Con

    * BOS = Bottom Of Stack

    * LOS = Limit Of Stack

    * TOS = Top Of Stack (non necessariamente esplicito)

    * SP = Stack Pointer

    la gestione dello stack comporta tre operazioni.

    ---------------

    stack.init(minimoIndirizzo, quantaMemoria)

    quest'operazione inizializza i riferimenti

    fissi

    * BOS = minimoIndirizzo

    * LOS = BOS + quantaMemoria

    e variabili (se distinti)

    * TOS = BOS

    * SP = TOS + 1

    ---------------

    stack.push(strutturaDiDati)

    quest'operazione

    controlla che lo stack non trabocchi

    * if SP + size[strutturaDiDati] > LOS: errore "MemoryOverflow"

    copia i dati a partire dal primo indirizzo vuoto

    * SP^ = strutturaDiDati

    aggiorna i puntatori e salva il vecchio SP* TOS = TOS + size[strutturaDiDati] + 1

    * TOS^ = SP

    * SP = TOS + 1

    ---------------

    stack.pop()

    quest'operazione

    controlla che sullo stack ci sia un frame da liberare

    * if TOS == BOS: errore "EmptyStack"

    libera il frame

    * SP = TOS^

    * TOS = SP - 1

    ------------------------------

    POSSO AVERE SCRITTO COSE INCOERENTI: non ho definito un oggetto di prova; ho scritto solo quanto basta a chiarire le operazioni.

  • Anonimo
    3 sett fa

    pop, push, top e bottom non sono funzioni proprie del linguaggio "C", ma possono essere costruite. Immagina di avere una pila (non quella elettrica, ma quella composta, ad esempio, da piatti messi uno sopra l'altro, impilati).

    In una pila (inglese: stack) puoi aggiungere e togliere un elemento e hai due modi per farlo LIFO e FIFO; sono due acronimi e significano "last in - first off" e "first in - first off", ovvero "l'ultimo impilato è il primo ad essere prelevato" (come si fa normalmente nei ristoranti), oppure "il primo ad essere stato impilato è il primo ad essere prelevato (un pò scomodo...).

    In informatica l'operazione per mettere un oggetto in una pila, è detta "push",

    mentre quella per prelevarlo, è detta "pop". La funzione "top" indica la sommità della pila; se le posizioni "top" e "bottom", cioè cima e fondo, sono contigue, significa che la pila è vuota.

    Se hai il compilatore Borland e vuoi vedere come funziona uno stack con

    vettore:

    #include <stdio.h>

    #include <conio.h>

    /***********************

    *   prototipi funzioni *

    ************************/

    void push(int,int);

    int pop(int);

    void top(void);

    int v[20],i=0;

    main()

    {

     int tasto,el,p,u;

     printf("Simulazione delle funzioni PUSH(), POP() e TOP().\n");

     printf("Per inserire un elemento premere F5, per estrarlo F6.\n");

     printf("Creazione della PILA.\n");

     for(i=0;i<20;i++)

     {

       v[i] = 0;

       printf("%d ",v[i]);

     }

     i = 0;

     do{

     printf("\n F5 - mette un elemento nello stack\n");

     printf(" F6 - preleva un elemento dallo stak\n");

     printf(" F7 - elemento in cima allo stack\n");

     printf(" F8 - elemento in fondo allo stack\n");

     printf(" F9 - Visualizza lo stack\n");

     tasto = bioskey(0);

      switch (tasto)

      {

        case 16128: /* F5 push */

           if(i>19)

           {

            printf("stack pieno!");

            break;

           }

           printf("digita il numero da inserire: ");

           scanf("%d",&el);

           push(el,i);

           i++;

           break;

        case 16384: /* F6 pop */

           if(i==0){

            printf("stack vuoto");

            break;

           }

           printf("%d",pop(i-1));

           i--;

           break;

        case 16640: /* F7 top */

           p = i-1;

           if(p<0)

            p = 0;

           printf("%d\n",v[p]);

           break;

        case 16896: /* F8 bottom */

          printf("\n%d",v[0]);

          bioskey(0);

          break;

        case 17152: /* F9 visualizza */

           for(u=0;u<i;u++)

             printf("%d ",v[u]);

           bioskey(0);

           break;

        }

      }while(tasto != 283);

     }

    void push(pf,pos)

    {

     v[pos] = pf;

     return;

    }

    int pop(a)

    {

      return v[a];

    }

  • 3 sett fa

    push X

    aggiunge 1 a sp poi prende il contenuto del registro X e lo mette nel registro a cui punta sp

    pop X è il contrario

    prende il contenuto della cella a cui punta sp, lo  mette nel registro X e poi decrementa di 1 sp

Altre domande? Fai una domanda e ottieni le risposte che cerchi.