Cấu trúc dữ liệu tốt nhất cho ngăn xếp chiều dài cố định (ban đầu tôi gọi nó là hàng đợi, nhưng thứ tôi muốn là ngăn xếp), nơi các mục được thêm vào mặt trước và mỗi lần thêm mục phía trước một mục được lấy ra từ đầu? Chiều dài khác nhau của subvectors sẽ được truy cập từ phía trước cũng. Tôi đã sử dụng vectơ, bây giờ nghĩ về clojure.lang.PersistentQueue và cây ngón tay.Cấu trúc ngăn xếp chiều dài cố định ở Clojure
chỉnh sửa, để làm rõ, một cái gì đó như:
> (def q (queue [1 2 3 4]))
[1 2 3 4]
> (push q 9 8 7)
[7 8 9 1]
> (peek (push q 9 8 7))
7
edit2: cảm ơn cho tất cả các câu trả lời của bạn cho đến nay, điều này đã trở thành một bài tập trong sẽ trở lại vấn đề cơ bản và đọc Joy của Clojure, học tập ví dụ mà subvec của subvec giữ lại một tham chiếu đến vector của subvec đầu tiên, trong khi một cái gì đó như (vec (cons x (subvec ... sẽ nếu được sử dụng liên tục tích luỹ các tham chiếu tới tất cả các subvec trung gian). hàng đợi dựa trên?:
(defn push [v i n] (if (>= (count v) n) (conj (subvec v 1 n) i) (conj v i)))
thì vector kết quả có thể được truy cập thông qua rseq mà tôi tin là nhanh với vectơ (do sử dụng các chỉ số bù đắp?)
Dangit! Ăn cắp danh tiếng SO của tôi bằng cách liên kết đến thư viện của tôi? Tôi nhóc, tất nhiên rồi. Trên thực tế tôi tò mò làm thế nào bạn tìm thấy nó, kể từ khi tôi đã không quảng cáo nó ở tất cả và tìm kiếm google cho 'clojure ring buffer' không bật lên bất cứ điều gì terribly dễ dàng. – amalloy
Tôi tìm thấy nó trong google tại một số điểm và bây giờ là trong dấu trang của tôi;). Cảm ơn! – DanLebrero
xin lỗi để làm rõ, vòng đệm sẽ là hoàn hảo nếu các mục của nó đã được thêm vào và nhìn trộm ở phía trước và đẩy ra từ cuối. Đó là cùng một vấn đề tôi đã có với PersistentQueue: conj thêm vào cuối nhưng nhìn ở phía trước, nhưng tôi chỉ quan tâm đến hầu hết các mục gần đây (lifo) với các mục cũ nhất được gỡ bỏ đầu tiên – Hendekagon