Gibt es eine vorhandene Datenstruktur mit fester Größe, die beim Einfügen eines neuen Elements das älteste / letzte Element auswirft?


20

Ich suche nach einer Datenstruktur, die sein ältestes / letztes Element herausdrückt, wenn ein neues Element eingefügt wird. Stellen Sie beispielsweise Ddie Struktur dar. DEnthält 3 Elemente, werden die Number DStandardwerte des Typs auf 1, 2und initialisiert 3.

D=[1,2,3]

Wenn ein Number, der den Wert enthält, 5eingefügt wird D, 3wird herausgedrückt, während 1und 2nach rechts verschoben werden.

D=[5,1,2]

Das erste, was mir einfällt, ist ein Array, aber die Definition beinhaltet nicht das Push-Verhalten.


Nun, es gibt keine eingebaute Datenstruktur, aber es ist einfach, sie mit einer doppelt verknüpften Liste zu implementieren, oder?
Benutzer nicht gefunden

1
Was ist mit einem Wrapper, der von einer Warteschlange erbt? Dann fügen Sie die Methode hinzu void push_replace(T val) { pop(); push(val); }.
Francesco Dondi

@FrancescoDondi sollte wahrscheinlich seinT push_replace(T val) { T old = pop(); push(val); return old; }
Valbaca

1
Es gibt definitiv jetzt: Sie haben es nur informell definiert; Vielleicht sollten Sie sich fragen, ob es bekannt ist, eine allgemein anerkannte Schnittstelle hat und ob Implementierungen verfügbar sind (nicht, dass die letzte ein großes Problem darstellt).
PJTraill

@valbaca Ich denke an C ++, wo pop()aufgrund von Problemen mit dem Stack-Abwickeln im Falle von Ausnahmen, die ein komplexes Objekt auskopieren, nichts zurückgegeben wird. Sie sollten es also front()vorher verwenden, wenn Sie es vor dem Verwerfen benötigen. Aber sicher, wenn Sie sich nicht für Ausnahmen interessieren, kann Ihr Weg besser sein.
Francesco Dondi

Antworten:


44

Feste Größe Warteschlangen werden oft implementiert , was einige Leute nennen Ringpuffer . Wenn Sie den Schutz dagegen entfernen, dass er voll ist, erhalten Sie das gewünschte Verhalten.

Natürlich wird im Array kein tatsächliches Pushing stattfinden - das wäre zu teuer - aber es wird von außen so aussehen .


Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.