我可以像堆栈一样使用列表,但是在ATS中创建队列的正确方法是什么?例如,假设我有以下伪代码:
val xs = queue_create()
val () = xs.enqueue(1)
val () = xs.enqueue(2)
val () = print(xs.dequeue()) // print 1
val () = xs.enqueue(3)
val () = print(xs.dequeue()) // print 2
val () = print(xs.dequeue()) // print 3
我应该看到打印出1,2和3。
答案 0 :(得分:2)
由于我不知道ATS标准库中内置的队列类型,因此我从我的一个项目中提供了自己的基本实现,该项目是根据Linear Channels for Asynchronous IPC章节中引用的代码改编的。 > ATS编程简介一书。
请参阅this snippet中的工作示例。
答案 1 :(得分:0)
你可以采用冗长的方式:使用指向单链表的头尾的两个指针。
但是,确保此实施确实有效并非如此微不足道。它依赖于数据视图来编码某些不变量,因此非常复杂,但是外向的API根本不难使用。我还使用了“侵入式”链表,使用例更简单。
核心定义如下:
对单链接列表段进行编码的视图:段只是单个链接,“最后”next
指针可指向任何位置,包括NULL
:
dataview slseg_v
(addr(*self*), addr(*last node's [next]*), int(*segment length*)) =
| {n:nat} {l1,l2,l3:addr}
slseg_v_cons (l1, l3, n+1) of (
mfree_gc_v (l1), slseg_node_v (l2, l1), slseg_v (l2, l3, n)
) // end of [slseg_v_cons]
| {l:addr} slseg_v_nil (l, l, 0)
// end of [slseg_v]
键入基于列表的队列:它是空的,或者包含一个大小,一个指向段头的指针,以及一个指向段尾的指针:
datavtype queuelst_vt (int) =
| {n:nat} {l1,l2,l3:addr}
queuelst_vt_some (n+1) of (
slseg_v (l1, l2, n),
mfree_gc_v (l2),
slseg_node_v (null, l2)
| int n, ptr l1, ptr l2
) // end of [queuelst_vt_some]
| queuelst_vt_none (0) of ()
您可以在Glot.io
运行完整代码这是同一个code的清理版本 - 这一次,我试图确保代码具有干净的接口/实现分离。