Esiste una struttura di dati esistente di dimensioni fisse e spingerà fuori l'elemento più vecchio / ultimo se viene inserito un nuovo elemento?


20

Sto cercando una struttura di dati che spingerà fuori il suo elemento più vecchio / ultimo se viene inserito un nuovo elemento. Ad esempio, lascia che Drappresenti la struttura. Dcontiene 3 elementi dei Number Dvalori predefiniti del tipo che verranno inizializzati su 1, 2e 3.

D=[1,2,3]

Se viene inserito un Numbervalore che contiene il valore , verrà rimosso, mentre e spostato a destra.5D312

D=[5,1,2]

La prima cosa che viene in mente sarebbe una matrice, ma la definizione non include il comportamento di spinta.


Bene, non esiste una struttura di dati incorporata, ma è semplice da implementare utilizzando un elenco di elenchi collegati Doubly, giusto?
Utente non trovato il

1
Che ne dici di usare un wrapper che eredita da una coda? Quindi aggiungi il metodo void push_replace(T val) { pop(); push(val); }.
Francesco Dondi,

@FrancescoDondi dovrebbe probabilmente essereT push_replace(T val) { T old = pop(); push(val); return old; }
valbaca il

1
Certamente c'è adesso: l'hai appena definito in modo informale; forse dovresti chiedere se è ben noto, ha un'interfaccia generalmente condivisa e se le implementazioni sono disponibili (non che l'ultimo sia un grosso problema).
PJTraill,

@valbaca Sto pensando a C ++ dove pop()non restituisce nulla a causa di problemi con lo svolgimento dello stack in caso di eccezioni nella copia di un oggetto complesso, quindi dovresti usare front()prima se ne hai bisogno prima di scartarlo. Ma certo, se non ti interessano le eccezioni, la tua strada può essere migliore.
Francesco Dondi,

Risposte:


44

Le code a dimensione fissa sono spesso implementate utilizzando ciò che alcune persone chiamano buffer circolari . Se si rimuove la protezione dal pieno, si ottiene il comportamento desiderato.

Ovviamente, nell'array non avverrà alcuna spinta effettiva - sarebbe troppo costoso - ma sembrerà dall'esterno.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Raffaello
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.