Types 在F中实现队列类型#
我试图在F#中实现一个队列,到目前为止,这就是我所拥有的,但我认为它更像一个堆栈:Types 在F中实现队列类型#,types,f#,queue,Types,F#,Queue,我试图在F#中实现一个队列,到目前为止,这就是我所拥有的,但我认为它更像一个堆栈: type 'a queue = NL| Que of 'a * 'a queue;; let enque m = function |NL -> Que(m, NL) |Que(x, xs) -> Que(m, Que(x, xs));; let rec peek = function |NL -> failwith "queue is empty" |Qu
type 'a queue = NL| Que of 'a * 'a queue;;
let enque m = function
|NL -> Que(m, NL)
|Que(x, xs) -> Que(m, Que(x, xs));;
let rec peek = function
|NL -> failwith "queue is empty"
|Que(x, xs) -> x;;
let rec deque = function
|NL -> failwith "queue is empty"
|Que(x, xs) -> xs;;
let rec build = function
| [] -> NL
| x::xs -> enque x (build xs);;
除了enque,其他操作都很正常,我想让它在队列后面添加一个新元素,而不是在队列前面。目前您将它放在队列前面;如果您想在队列末尾排队,您必须一直前进到队列末尾,然后输入您的值:
let rec enque m = function
NL -> Que (m, NL)
| Que (x, xs) -> Que (x, enque m xs) // Note : not tail-rec
函数队列的规范方法是有两个列表,这导致摊销O(1)访问:
类型队列
type queue<'a> =
| Queue of 'a list * 'a list
let empty = Queue([], [])
let enqueue q e =
match q with
| Queue(fs, bs) -> Queue(e :: fs, bs)
let dequeue q =
match q with
| Queue([], []) -> failwith "Empty queue!"
| Queue(fs, b :: bs) -> b, Queue(fs, bs)
| Queue(fs, []) ->
let bs = List.rev fs
bs.Head, Queue([], bs.Tail)