In una pila pura, le uniche operazioni consentite sono Push
, Pop
e Peek
ma in termini pratici, non è esattamente vero. O meglio, l'operazione Peek
spesso ti permette di guardare qualsiasi posizione sullo stack, ma il problema è che è relativo a un estremo dello stack.
Quindi, come altri hanno detto, un array è ad accesso casuale e tutto è riferito all'inizio dell'array .
In una pila, puoi aggiungere / rimuovere solo alla fine di lavoro della pila, ma hai ancora accesso casuale a lettura ma si fa riferimento al lato di lavoro . Questa è la differenza fondamentale.
Ad esempio, quando si passano i parametri su una pila a una funzione, il chiamato non deve escludere i parametri per guardarli. Spinge semplicemente le variabili locali nello stack e fa riferimento a tutte le variabili locali e ai parametri in base a un offset dal puntatore dello stack. Se si stesse usando solo un array, come avrebbe potuto sapere il chi calle dove cercare i suoi parametri? Quando il callee è terminato, apre le sue variabili locali, inserisce un valore di ritorno, restituisce il controllo al chiamante e il chiamante fa scattare il valore di ritorno (se presente), quindi apre i parametri dallo stack. Il bello è che funziona indipendentemente dal numero di chiamate all'interno delle chiamate di funzione (supponendo che non si esaurisca lo spazio disponibile).
Questo è un particolare uso / implementazione, ma illustra la differenza: l'array è sempre referenziato dall'inizio ma gli stack sono sempre referenziati da qualche posizione finale funzionante.
Una possibile implementazione di uno stack è un array più un indice per ricordare dove si trova la fine del lavoro.