Existe-t-il une structure de données existante de taille fixe qui repoussera l'élément le plus ancien / le dernier si un nouvel élément est inséré?

20

Je recherche une structure de données qui repoussera son élément le plus ancien / le dernier si un nouvel élément est inséré. Par exemple, Dreprésentons la structure. Dcontient 3 éléments des Number Dvaleurs par défaut du type seront initialisés à 1, 2et 3.

=[1,2,3]

Si un Numbercontenant la valeur 5est inséré dans D, 3sera poussé vers l'extérieur, tandis que 1et 2seront décalés vers la droite.

=[5,1,2]

La première chose qui vient à l'esprit serait un tableau, mais la définition n'inclut pas le comportement de poussée.

Greg M
la source
Eh bien, il n'y a pas de structure de données intégrée, mais il est simple à mettre en œuvre en utilisant une liste chaînée à double liste, n'est-ce pas?
Utilisateur introuvable
1
Qu'en est-il de l'utilisation d'un wrapper héritant d'une file d'attente? Ensuite, vous ajoutez la méthode void push_replace(T val) { pop(); push(val); }.
Francesco Dondi
@FrancescoDondi devrait probablement êtreT push_replace(T val) { T old = pop(); push(val); return old; }
valbaca
1
Il y en a certainement maintenant: vous venez de le définir de manière informelle; vous devriez peut-être demander si elle est bien connue, a une interface généralement acceptée et si des implémentations sont disponibles (pas que la dernière soit un gros problème).
PJTraill
@valbaca Je pense au C ++ où pop()ne retourne rien en raison de problèmes avec le déroulement de la pile en cas d'exceptions copiant un objet complexe, vous êtes donc censé l'utiliser front()avant si vous en avez besoin avant de le jeter. Mais bien sûr, si vous ne vous souciez pas des exceptions, votre chemin peut être meilleur.
Francesco Dondi

Réponses:

44

Les files d'attente de taille fixe sont souvent implémentées à l'aide de ce que certaines personnes appellent des tampons circulaires . Si vous supprimez la protection contre sa saturation, vous obtenez le comportement souhaité.

Bien sûr, aucune poussée réelle ne se produira dans la baie - ce serait trop cher - mais cela lui ressemblera de l'extérieur.

Raphael
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Raphael