Có một cấu trúc dữ liệu hiện có có kích thước cố định và sẽ đẩy phần tử cũ nhất / cuối cùng ra nếu một phần tử mới được chèn vào?


20

Tôi đang tìm kiếm một cấu trúc dữ liệu sẽ đẩy phần tử cũ nhất / cuối cùng của nó ra nếu phần tử mới được chèn vào. Ví dụ, hãy Dđại diện cho cấu trúc. Dchứa 3 phần tử của các Number Dgiá trị mặc định của loại sẽ được khởi tạo 1, 23.

D= =[1,2,3]

Nếu một Numbercái có chứa giá trị 5được chèn vào D, 3sẽ bị đẩy ra, trong khi 12được dịch sang phải.

D= =[5,1,2]

Điều đầu tiên xuất hiện trong đầu sẽ là một mảng, nhưng định nghĩa không bao gồm hành vi đẩy.


Vâng, không có cấu trúc dữ liệu được xây dựng nhưng thật đơn giản để thực hiện bằng cách sử dụng danh sách liên kết Danh sách liên kết đôi phải không?
Không tìm thấy người dùng

1
Còn việc sử dụng trình bao bọc kế thừa từ hàng đợi thì sao? Sau đó, bạn thêm phương thức void push_replace(T val) { pop(); push(val); }.
Francesco Dondi

@FrancescoDondi có lẽ nên làT push_replace(T val) { T old = pop(); push(val); return old; }
valbaca

1
Chắc chắn là có ngay bây giờ: bạn chỉ cần xác định nó một cách không chính thức; có lẽ bạn nên hỏi xem nó có nổi tiếng không, có giao diện được thỏa thuận chung hay không và liệu việc triển khai có sẵn không (không phải cuối cùng là một vấn đề lớn).
PJTraill

@valbaca Tôi đang nghĩ về C ++, nơi pop()trả về không có gì do vấn đề với ngăn xếp ngăn xếp trong trường hợp ngoại lệ sao chép một đối tượng phức tạp, vì vậy bạn nên sử dụng front()trước nếu bạn cần trước khi loại bỏ. Nhưng chắc chắn, nếu bạn không quan tâm đến ngoại lệ, cách của bạn có thể tốt hơn.
Francesco Dondi

Câu trả lời:


44

Hàng đợi có kích thước cố định thường được triển khai bằng cách sử dụng cái mà một số người gọi là bộ đệm tròn . Nếu bạn loại bỏ bảo vệ chống lại nó đầy, bạn sẽ có được hành vi mong muốn.

Tất nhiên, không có sự thúc đẩy thực sự nào sẽ xảy ra trong mảng - điều đó sẽ quá tốn kém - nhưng nó sẽ trông giống như nó từ bên ngoài.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.