Чи існує існуюча структура даних, яка має фіксований розмір, і виштовхне найстаріший / останній елемент, якщо вставлений новий елемент?


20

Я шукаю структуру даних, яка виштовхне його найстаріший / останній елемент, якщо вставити новий елемент. Наприклад, нехай Dпредставляє структуру. Dмістить 3 елементи Number Dтипових значень типу буде ініціалізовано до 1, 2та 3.

D=[1,2,3]

Якщо Numberщо містить значення 5вставляється D, 3буде виштовхувати, в той час як 1і 2зрушені вправо.

D=[5,1,2]

Перше, що спадає на думку, був би масив, але визначення не включає поведінку, що підштовхує.


Ну, немає вбудованої структури даних, але це просто реалізувати, використовуючи подвійний список, пов'язаний зі списком, правда?
— Користувача не знайдено

1
А як щодо використання обгортки, успадкованого з черги? Потім ви додаєте метод void push_replace(T val) { pop(); push(val); }.
— Франческо Донді

@FrancescoDondi, мабуть, має бутиT push_replace(T val) { T old = pop(); push(val); return old; }
— valbaca

1
Однозначно є зараз: ви просто неофіційно це визначили; можливо, ви повинні запитати, чи добре він відомий, чи є загально узгоджений інтерфейс і чи доступні реалізації (не те, що остання є великою проблемою).
— PJTraill

@valbaca Я думаю про C ++, де pop()нічого не повертається через проблеми з розмотуванням стека у випадку, якщо винятки копіюють складний об'єкт, тому ви повинні використовувати його front()раніше, якщо вам це потрібно, перш ніж відкинути. Але впевнено, якщо ви не переймаєтесь винятками, ваш шлях може бути кращим.
— Франческо Донді

Відповіді:


44

Черги з фіксованим розміром часто реалізовуються за допомогою того, що деякі називають круговими буферами . Якщо зняти захист від його заповнення, ви отримаєте бажану поведінку.

Звичайно, жодне фактичне натискання не відбудеться в масиві - це було б занадто дорого - але це виглядатиме як зовні.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
— Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.