【发布时间】:2019-11-21 23:05:35
【问题描述】:
我正在尝试在 Clojure 中实现堆栈的行为。从frequencies 的实现中得到启发,我创建了一个瞬态向量,我是conj!ing 元素(一个“推”)。我的问题是 pop! 从末尾删除元素,而其他一些 fns (rest,drop) 仅适用于惰性序列。
我知道我可以使用loop/recur(或reverseing 和pop!ing)来完成此操作,但我想更好地理解为什么不允许从瞬态向量的开头删除。我读了this,是不是因为允许它们被变异的实现只有 O(1),因为你只在最后编辑节点,如果你更改了需要复制整个向量的第一个节点?
【问题讨论】:
-
仅供参考 Clojure 的列表可以用作堆栈。 ``` (def stack '(:b :c)) (peek stack) (pop stack) (cons :a stack) ``
-
是的,可以。但正如我所说,我试图模仿
frequencies的行为,它使用不能转换为列表的transient以及 可以 转换为瞬态的所有数据结构(例如。 vector) 实现 pop 作为删除最后一个元素。