In una pila puro, le uniche operazioni consentite sono Push
, Pop
e Peek
ma in termini pratici, questo non è esattamente vero. O meglio, l' Peek
operazione spesso ti consente di guardare qualsiasi posizione nello stack, ma il problema è che è relativo a un'estremità dello stack.
Quindi, come altri hanno già detto, un array è un accesso casuale e tutto è riferito all'inizio dell'array .
In uno stack, puoi aggiungere / rimuovere solo all'estremità di lavoro dello stack, ma hai ancora accesso casuale letto ma è riferito all'estremità di lavoro . Questa è la differenza fondamentale.
Ad esempio, quando si passano parametri su una pila a una funzione, la chiamata non deve togliere i parametri per guardarli. Spinge semplicemente le variabili locali nello stack e fa riferimento a tutte le variabili e ai parametri locali in base a un offset dal puntatore dello stack. Se si stesse usando solo un array, come farebbe il chiamante a sapere dove cercare i suoi parametri? Al termine della chiamata, elimina le variabili locali, invia un valore di ritorno, restituisce il controllo al chiamante e il chiamante estrae il valore di ritorno (se presente), quindi estrae i parametri dallo stack. Il bello è che funziona indipendentemente da quanto sei annidato nelle chiamate di funzione (supponendo che tu non abbia esaurito lo spazio dello stack).
Questo è un uso / implementazione particolare, ma illustra la differenza: l'array è sempre referenziato dall'inizio, ma gli stack sono sempre referenziati da una posizione finale di lavoro.
Una possibile implementazione di uno stack è un array più un indice per ricordare dove si trova il punto di lavoro.