有没有办法在Java或C#中实现支持泛型类型的异构类型的队列?
以下是Queue的模块类型。
module type Queue =
sig
type element
type queue
exception EMPTY_Q
val emptyq: queue
val enq: queue * element -> queue
val deq: queue -> element * queue
end
如果我想实现字符串队列,我会输入这样的代码。
module StringQ : Queue with type element = string =
struct
type element = string
type queue = (* queue type *)
exception EMPTY_Q
let emptyq: queue = (* empty queue *)
let enq: queue * element -> queue =
(* enqueue logic *)
let deq: queue -> element * queue =
(* dequeue logic *)
end
而且,如果我需要实现整数队列,有没有办法实现它而不复制并粘贴上部enq
,deq
逻辑?
我认为无论元素类型如何,enq
,deq
逻辑都是相同的。
答案 0 :(得分:4)
您可以编写多态队列:
exception EMPTY_Q
type 'a q = Q of 'a list * 'a list
let pq_empty = Q ([], [])
let pq_enqueue (Q (a, b)) c = Q (a, c :: b)
let rec pq_dequeue (Q (a, b)) =
match a, b with
| [], [] -> raise EMPTY_Q
| [], _ -> pq_dequeue (Q (List.rev b, []))
| h :: t, _ -> (h, Q (t, b))
您还可以编写一个函数队列,即一个由队列元素类型参数化的模块。
在任何一种情况下都不需要为每种不同的元素类型编写代码。
但是在这两种情况下,队列都是同类的,即任何一个队列的所有元素都属于同一类型。