Qual è la migliore struttura dati per uno stack di lunghezza fissa (inizialmente l'ho chiamato una coda, ma quello che voglio è uno stack) dove gli elementi vengono aggiunti in primo piano e ogni volta che viene aggiunto un elemento in primo piano un oggetto viene rimosso dalla fine? Si accede anche a varie lunghezze di subvettori dalla parte anteriore. Stavo usando i vettori, ora penso a clojure.lang.PersistentQueue e finger trees.Struttura stack in lunghezza fissa in Clojure
modificare, per chiarire, qualcosa come:
> (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: grazie per tutte le vostre risposte finora, questo è trasformato in un esercizio di tornare alle origini e la lettura di Gioia del Clojure, imparando per esempio che subvec di subvec mantiene un riferimento al vettore del primo subvec, mentre qualcosa del genere (vec (cons x (subvec ... sarebbe se usato ripetutamente accresca i riferimenti a tutti i subvec intermedi.) Alla luce di questo, che ne dici di questa implementazione di push per un vettore -based queue?:
(defn push [v i n] (if (>= (count v) n) (conj (subvec v 1 n) i) (conj v i)))
allora il vettore risultante è stato possibile accedere tramite rseq che credo sia veloce con vettori (conseguente al suo impiego dell'indice-offset?)
dangit! Rubando la mia reputazione SO collegandomi alla mia biblioteca? Io, ragazzo, naturalmente. In realtà sono curioso di come l'hai trovato, dal momento che non l'ho affatto pubblicizzato e una ricerca su google per "buffer anello clojure" non mostra nulla di terribilmente facile. – amalloy
L'ho trovato in Google ad un certo punto e ora è nei miei preferiti;). Grazie! – DanLebrero
scusa per chiarire, ring-buffer sarebbe perfetto se i suoi articoli fossero aggiunti e sbirciati nella parte anteriore ed espulsi dalla fine. È lo stesso problema che ho avuto con PersistentQueue: conj aggiunge alla fine ma sbircia in prima fila, ma mi interessa solo gli elementi più recenti (lifo) con gli elementi più vecchi che vengono rimossi per primi – Hendekagon