Clojure中的固定长度堆栈结构

Hen*_*gon 7 queue clojure

什么是固定长度堆栈的最佳数据结构(我最初称之为队列,但我想要的是一个堆栈),其中项目被添加到前面,每次将项目添加到前面时,项目将从结束?从前面也可以访问各种长度的子向量.我正在使用矢量,现在考虑clojure.lang.PersistentQueue和手指树.

编辑,澄清,例如:

> (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
Run Code Online (Sandbox Code Playgroud)

edit2:感谢你到目前为止所有的答案,这已经变成了回归基础和阅读Clojure的乐趣的练习,例如学习subvec的subvec保留对第一个subvec的向量的引用,而像(vec(cons) x(subvec ...如果反复使用会产生对所有中间子集的引用.鉴于此,如何推送基于矢量的队列的推送?:

(defn push [v i n] (if (>= (count v) n) (conj (subvec v 1 n) i) (conj v i) ) )
Run Code Online (Sandbox Code Playgroud)

然后可以通过rseq访问生成的向量,我相信它对向量很快(由于它使用索引偏移?)

Dan*_*ero 6

https://github.com/amalloy/ring-buffer上查看Amalloy的环形缓冲区

  • 该死的!通过链接到我的图书馆来窃取我的SO声誉?当然,我小子.实际上我很好奇你是如何找到它的,因为我根本没有做广告,谷歌搜索"clojure ring buffer"并没有发现任何特别容易的东西. (4认同)