Qual è la differenza tra un array e uno stack?


10

Secondo Wikipedia, uno stack :

è un tipo di dati astratto ultimo in, primo in uscita (LIFO) e una struttura di dati lineare.

Mentre un array :

è una struttura di dati costituita da una raccolta di elementi (valori o variabili), ciascuno identificato da almeno un indice o chiave dell'array.

Per quanto ho capito, sono abbastanza simili. Quindi, quali sono le principali differenze? Se non sono uguali, cosa può fare una matrice che una pila non può e viceversa?


5
In che modo la tua domanda non ha ricevuto risposta da ciò che hai trovato in Wikipedia? È possibile accedere agli elementi di un array in qualsiasi ordine; è necessario accedere a uno stack in ordine LIFO.
Caleb,

8
@Caleb Solo perché leggi qualcosa non significa che capisci il concetto. Nella mia mente, non l'ho capito fino a quando non l'ho chiesto.
Dinamico

3
-1 In pratica hai pubblicato la risposta nella tua domanda. Cosa stai chiedendo di nuovo?
Andres F.

1
@AndresF. Non riesco a capire cosa significhi ... Se potessi guardare un articolo di Wikipedia e capire cosa stanno dicendo la prima volta, il mondo sarebbe perfetto.
Dinamico

2
Ho appena letto meta.programmers e ho capito perché hai posto questa non-domanda: è per un concorso. Dubito seriamente che tu non abbia capito l'articolo di Wikipedia. Vergogna: /
Andres F.

Risposte:


45

Bene, puoi certamente implementare uno stack con un array. La differenza sta nell'accesso. In un array, hai un elenco di elementi e puoi accedervi in ​​qualsiasi momento. (Pensa a un mucchio di blocchi di legno disposti tutti in fila.)

Ma in una pila, non vi è alcuna operazione di accesso casuale; ci sono solo Push, Peeke Pop, tutti che trattano esclusivamente dell'elemento in cima alla pila. (Pensa ai blocchi di legno accatastati verticalmente ora. Non puoi toccare nulla sotto la cima della torre o cadrà.)


11
blocchi di legno - bella analogia
Jesse Black

1
Dici "in pila, non ci sono operazioni ad accesso casuale" ma non sono d'accordo e aggiungerò maggiori dettagli nella mia risposta.
Scott Whitlock,

le pile sono sicuramente implementate con accesso casuale
old_timer

4
Devi fare schifo a Jenga.
DisgruntledGoat

1
@ Mason, lo so. Era uno scherzo.
DisgruntledGoat

6

In una pila puro, le uniche operazioni consentite sono Push, Pope Peekma in termini pratici, questo non è esattamente vero. O meglio, l' Peekoperazione 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.


Per me questa è la risposta. La domanda su quale sia la differenza tra un array e uno stack dipende dal perché abbiamo bisogno dello stack quando l'array sembra meno vincolato e più versatile. E questo risponde: è proprio perché lo stack è più vincolato che l'utilizzo in casi appropriati (ad es. Chiamate di funzione qui) rende logico l'attrezzo. Henco "la bellezza"
Todanley

4

Penso che la più grande confusione in corso qui sia l'implementazione rispetto alle strutture di dati di base.

Nella maggior parte (più lingue di base) un array rappresenta un insieme di elementi a lunghezza fissa a cui è possibile accedere in qualsiasi momento. Il fatto che tu abbia un sacco di elementi come questo non ti dice nulla su come dovrebbe essere usato (e francamente un computer non saprà / si preoccuperà di come lo usi, purché non violi l'uso).

Uno stack è un'astrazione utilizzata per rappresentare i dati che dovrebbero essere gestiti in un determinato modo. Questo è un concetto astratto perché dice solo che deve avere una subroutine / metodo / funzione che può essere aggiunta all'inizio o rimossa dall'alto, mentre i dati sotto la parte superiore non vengono toccati. Semplicemente la tua scelta di usare un array in questo modo.

È possibile creare una pila di diversi tipi di strutture di dati: matrici (con una dimensione massima), matrici dinamiche (che possono crescere quando si esaurisce lo spazio) o elenchi collegati. Personalmente ritengo che un elenco collegato rappresenti al meglio le restrizioni di uno stack, in quanto è necessario fare uno sforzo per vedere le cose oltre il primo elemento ed è molto facile aggiungere in primo piano e rimuovere in primo piano.

Quindi puoi usare un array per CREARE uno stack, ma non sono equivalenti


3

Le loro responsabilità sono diverse:

  • Stack deve essere in grado di far apparire gli elementi nello stack e spingere gli elementi dallo stack, quindi perché normalmente ha metodi Pop()ePush()

  • La responsabilità dell'array è ottenere / impostare l'elemento in un indice specificato


3

È possibile recuperare un elemento da qualsiasi indice di un A \ array.

Con una pila, puoi recuperare un oggetto nel mezzo della pila A, usando un'altra pila: B.

Continui a prendere l'oggetto in cima ad A e a metterlo in B fino a raggiungere l'oggetto desiderato in A, quindi rimetti gli oggetti da B in cima allo stack A.

Pertanto, per i dati che richiedono la possibilità di recuperare un indice arbitrario, è più difficile lavorare con lo stack.

Nella situazione in cui si desidera un comportamento "ultimo in entrata, primo in uscita", uno stack offre un sovraccarico minore di un array.


0

Non direi che sono "molto simili".

Un array viene utilizzato per contenere oggetti a cui si accederà successivamente in sequenza o tramite l'indice. La struttura dei dati non implica alcun tipo di metodo di accesso (FIFO, LIFO, FILO, ecc ...) ma può essere utilizzato in questo modo se lo si desidera.

Una pila è il modo di tracciare le cose mentre vengono generate. È implicito / richiesto un metodo di accesso a seconda del tipo di stack creato. Una pila di frame sarebbe un esempio LIFO. Disclaimer - Potrei mescolare qui la mia tassonomia della struttura dei dati e uno stack potrebbe davvero consentire LIFO. Altrimenti sarebbe un diverso tipo di coda.

Quindi potrei usare una matrice come una pila (anche se non vorrei) ma non posso usare una pila come una matrice (a meno che non ci lavori molto).


1
Nel dominio delle "strutture per l'archiviazione di raccolte di oggetti", non direi che sono molto simili. Nel dominio dei concetti di programmazione, direi che sono abbastanza simili. Nel dominio delle cose in generale, direi che sono quasi identici.
Kirk Broadhurst

0

È possibile accedere ai dati in un array tramite una chiave o un indice. È possibile accedere ai dati in uno stack quando viene rimosso dalla parte superiore dello stack. Ciò significa che l'accesso ai dati da un array è facile se si conosce il suo indice. Accedere ai dati da uno stack significa che è necessario mantenere gli elementi di pop-up fino a quando non si trova quello che si stava cercando, il che significa che l'accesso ai dati può richiedere più tempo.


0

Un array è dal punto di vista dei programmatori, fissato in posizione e dimensioni, sai dove ti trovi e dove si trova tutto. Hai accesso a tutto questo.

Con una pila, ti siedi su un'estremità ma non hai idea delle sue dimensioni o di quanto lontano puoi andare in sicurezza. Il tuo accesso ad esso è limitato all'importo che hai assegnato, spesso non sai nemmeno se durante l'allocazione dell'importo desiderato se avessi semplicemente sbattuto nell'heap o nello spazio del programma. La tua vista di uno stack è un piccolo array che ti sei assegnato, la dimensione che desideri, che hai il controllo e puoi vedere. La tua porzione non è diversa da un array. La differenza sta nel fatto che il tuo array è attaccato a un'estremità di un altro array per ragioni di argomento e terminologia, di cui non hai visibilità, non hai idea di quanto sia grande o piccolo, e non puoi toccarlo senza causare danni. Un array, a meno che globale, viene spesso implementato nello stack, quindi l'array e lo stack condividono lo stesso spazio per la durata di quella funzione.

Se vuoi entrare nel lato hardware, ovviamente è specifico del processore, ma generalmente l'array si basa su un punto / indirizzo iniziale noto, la dimensione è conosciuta dal compilatore / programmatore e gli indirizzi vengono calcolati in esso, a volte usando l'indirizzamento dell'offset del registro (caricare un valore dall'indirizzo definito da questo valore del registro di base più questo valore del registro di offset, allo stesso modo quando compilato potrebbe essere un offset immediato non necessariamente basato sul registro, dipende ovviamente dal processore) che nell'assemblaggio molto ricorda l'accesso a un array con un codice di alto livello. Allo stesso modo con lo stack, se disponibile, è possibile utilizzare il registro o l'indirizzamento offset immediato, spesso sebbene utilizzi un registro speciale, o il puntatore dello stack stesso o un registro riservato dal compilatore / programmatore da utilizzare per accedere al frame dello stack per quello funzione. E per alcuni processori vengono utilizzate e / o richieste speciali funzioni di accesso allo stack per accedere allo stack. Hai le istruzioni push e pop ma non vengono utilizzate tutte le volte che potresti pensare e non si applicano davvero a questa domanda. Per alcuni processori push e pop sono alias di istruzioni che possono essere utilizzate con qualsiasi registro, ovunque, non solo con il puntatore dello stack nello stack, rimuovendo ulteriormente push e pop dall'essere correlati a questa domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.