2012-11-12 13 views
7

固定長スタック(私はもともとはキューと呼ばれていましたが、私が欲しいのはスタックです)は、項目が追加され、項目が追加されるたびにアイテムは最後から削除されます。さまざまな長さのサブベクトルも前面からアクセスされます。私はベクトルを使用していましたが、今ではclojure.lang.PersistentQueueと指の木について考えています。明確にするClojureの固定長スタック構造

編集、、のようなもの:

> (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:すべてのあなたの答えのためのおかげで今のところ、これはそのインスタンスの学習、基本に戻るだろうとのClojureの喜びを読んで、運動になっていますサブベクトルのサブベクトルは、最初のサブベクトルのベクトルへの参照を保持します(vec(cons x(subvec ...)を繰り返し使用すると、すべての中間サブベクトルへの参照が発生します)。ベースのキュー?:

(defn push [v i n] (if (>= (count v) n) (conj (subvec v 1 n) i) (conj v i))) 

その後、得られたベクターは、私はベクトルと高速であると信じていRSEQを介してアクセスすることができた(原因の使用にインデックスオフセット?)

答えて

6

はIMOあなただけ使用することができますhttps://github.com/amalloy/ring-buffer

+4

Dangit!私の図書館にリンクして私の評判を盗みましたか?私はもちろん、子供です。実際に私はあなたがそれを見つけたのか不思議です。私はそれをまったく宣伝していないので、 'clojure ring buffer'のgoogle検索は何もひどく簡単には上がらないからです。 – amalloy

+0

私はある時点でgoogleで見つけて、今は自分のブックマークに入れています;)。ありがとう! – DanLebrero

+1

リングバッファは、そのアイテムが追加されて前面から覗き見され、最後から取り出されると、完璧なものになります。私はPersistentQueueと同じ問題です:conjは最後に追加しますが、前面にはピークが表示されますが、最も古いアイテム(lifo)は最初に削除されます。 – Hendekagon

1

でAmalloyのリングバッファを見てくださいリスト:

(defn create-queue [len] 
    (atom (repeat len nil))) 

(defn push [queue new-items] 
    (let [len (count @queue) 
     len2 (count new-items)] 
    (if (>= len2 len) 
     (let [res (concat (take-last (- len2 len) new-items) 
         @queue)] 
     (reset! queue (take len new-items)) 
     res) 
     (let [res (take-last len2 @queue)] 
     (reset! queue (concat new-items 
           (drop-last len2 @queue))) 
     res)))) 

テスト:

(def q (create-queue 4)) 

(take 4 @q) 
-> (nil nil nil nil) 
(push q [1 2 3]) 
-> (nil nil nil) 
(take 4 @q) 
-> (1 2 3 nil) 
(push q [4 5]) 
-> (3 nil) 
(take 4 @q) 
-> (4 5 1 2) 
(push q [6 7 8 9]) 
-> (4 5 1 2) 
(take 4 @q) 
-> (6 7 8 9) 
(push q [10 11 12 13 15 16]) 
-> (15 16 6 7 8 9) 
(take 4 @q) 
-> (10 11 12 13) 
+0

okですが、すでにベクターを使っていましたが、ここでは原子の必要はありません。 – Hendekagon

+0

また、スレッドセーフな解決策のためには、atomの代わりにrefを必要とし、dosyncですべての作業をする必要があります。 – mobyte

+0

hmm、永続的な構造を好むでしょう – Hendekagon

関連する問題