Array come Stack e Code in JavaScript
- In JavaScript, gli array possono essere utilizzati come stack e code grazie ai metodi
push(),pop(),shift()eunshift(). - I metodi
push()epop()consentono di lavorare con gli array come stack, seguendo il principio LIFO (Last In, First Out). - Il metodo
push()aggiunge uno o più nuovi elementi alla fine di un array, mentrepop()rimuove l'ultimo elemento dell'array e restituisce il valore rimosso. - I metodi
unshift()eshift()consentono di lavorare con gli array come code, seguendo il principio FIFO (First In, First Out). unshift()aggiunge uno o più nuovi elementi all'inizio di un array, mentreshift()rimuove il primo elemento dell'array e restituisce il valore rimosso.- Gli array in JavaScript possono essere utilizzati per implementare stack e code, ma è importante considerare l'efficienza delle operazioni, poiché
unshift()eshift()possono essere meno efficienti rispetto apush()epop().
Usare Array come Stack e Code
Uno dei grandi vantaggi degli array in JavaScript è che possono essere utilizzati come stack e code, grazie ai metodi push(), pop(), shift() e unshift().
I metodi push() e pop() consentono di lavorare con gli array come se fossero stack.
Il metodo push() aggiunge uno o più nuovi elementi alla fine di un array e restituisce la nuova lunghezza dell'array. A differenza di concat(), push() non appiattisce gli argomenti array. Il metodo pop() fa l'opposto: elimina l'ultimo elemento di un array, decrementa la lunghezza dell'array, e restituisce il valore che ha rimosso.
Si noti che entrambi i metodi modificano l'array sul posto. La combinazione di push() e pop() consente di utilizzare un array JavaScript per implementare uno stack, ossia una pila, una struttura dati in cui gli elementi vengono aggiunti e rimossi solo dalla fine, seguendo il principio LIFO (Last In, First Out).
Vediamo un esempio:
// Iniziamo con un array vuoto.
// Rappresenta una pila vuota.
let pila = []; // pila == []
// Aggiungiamo due elementi alla pila.
// La pila ora contiene due elementi.
pila.push(1,2); // pila == [1,2];
// Rimuoviamo l'ultimo elemento dalla pila.
pila.pop(); // pila == [1]; restituisce 2
// Aggiungiamo un altro elemento alla pila.
// La pila ora contiene due elementi.
pila.push(3); // pila == [1,3]
// Rimuoviamo l'ultimo elemento dalla pila.
pila.pop(); // pila == [1]; restituisce 3
// Aggiungiamo un array alla pila.
pila.push([4,5]); // pila == [1,[4,5]]
// Rimuoviamo l'ultimo elemento dalla pila.
pila.pop() // pila == [1]; restituisce [4,5]
// Rimuoviamo l'ultimo elemento dalla pila.
// La pila ora è vuota.
pila.pop(); // pila == []; restituisce 1
Il metodo push() non appiattisce l'array passato, ma se vogliamo inserire tutti gli elementi da un array su un altro array, possiamo utilizzare l'operatore spread per appiattirlo esplicitamente:
let valori = [4,5];
// Aggiungiamo gli elementi dell'array `valori`
// all'array a
a.push(...valori);
I metodi unshift() e shift() si comportano molto come push() e pop(), eccetto che inseriscono e rimuovono elementi dall'inizio di un array piuttosto che dalla fine. unshift() aggiunge un elemento o elementi all'inizio dell'array, sposta gli elementi dell'array esistenti verso indici più alti per fare spazio, e restituisce la nuova lunghezza dell'array. shift() rimuove e restituisce il primo elemento dell'array, spostando tutti gli elementi successivi giù di una posizione per occupare lo spazio appena liberato all'inizio dell'array.
Si potrebbe utilizzare unshift() e shift() per implementare uno stack, ma sarebbe meno efficiente che utilizzare push() e pop() perché gli elementi dell'array devono essere spostati su o giù ogni volta che un elemento viene aggiunto o rimosso all'inizio dell'array.
Invece, si potrebbe implementare una struttura dati coda utilizzando push() per aggiungere elementi alla fine di un array e shift() per rimuoverli dall'inizio dell'array:
// Iniziamo con una coda vuota.
let q = []; // q == []
// Aggiungiamo due elementi alla coda.
q.push(1,2); // q == [1,2]
// Rimuoviamo il primo elemento dalla coda.
q.shift(); // q == [2]; restituisce 1
// Aggiungiamo un altro elemento alla coda.
q.push(3) // q == [2, 3]
// Rimuoviamo il primo elemento dalla coda.
q.shift() // q == [3]; restituisce 2
// Rimuoviamo un altro elemento dalla coda.
// La coda ora è vuota.
q.shift() // q == []; restituisce 3
C'è una caratteristica di unshift() che vale la pena evidenziare perché potrebbe sorprendere alcuni lettori. Quando passiamo più argomenti a unshift(), essi vengono inseriti tutti in una volta, il che significa che finiscono nell'array in un ordine diverso rispetto a se li inserissimo uno alla volta:
let a = []; // a == []
a.unshift(1) // a == [1]
a.unshift(2) // a == [2, 1]
a = []; // a == []
a.unshift(1,2) // a == [1, 2]
La motivazione di questo comportamento è che unshift() inserisce gli elementi nell'array in base all'ordine in cui vengono forniti, piuttosto che all'ordine in cui vengono chiamati. Quindi, se passiamo più argomenti a unshift(), tutti gli argomenti vengono inseriti all'inizio dell'array in un'unica operazione, piuttosto che uno alla volta.