固定长度堆栈(我最初称它为队列,但我想要的是堆栈)的最佳数据结构是什么,其中将项目添加到前端,并且每次将项目添加到前端时,都会从结尾?各种长度的子向量也将从前面访问。我正在使用向量,现在正在考虑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
edit2:谢谢您到目前为止的所有回答,这已变成一种练习,可以回顾基础知识并阅读Clojure的喜悦,例如,了解subvec的subvec保留了对第一个subvec向量的引用,而类似(vec(cons x(subvec ...如果反复使用,将产生对所有中间subvecs的引用。鉴于此,对于基于矢量的队列的push实现如何?:
(defn push [v i n] (if (>= (count v) n) (conj (subvec v 1 n) i) (conj v i) ) )
那么可以通过rseq访问生成的向量,我相信使用rseq可以很快(由于使用了index-offset?)
最佳答案
看看https://github.com/amalloy/ring-buffer的Amalloy环形缓冲区