データ構造の「双端列」
2366 ワード
二重の列は何ですか?
デュアルエンド・キューとは、両端が入隊と出隊操作が可能なキューのことで、dequeは「double ended queue」の略称です.要素はチームの先頭から出てもいいし、入隊もできます.
ツーエンドの列はどうやって実現しますか?
ダブルキューの記憶構造
双端の列は列と同じです.もっと柔軟になっただけで、頭と列の最後は入隊と出隊の操作ができます.ここではチェーンテーブルの二重端列に基づいて実現されています.具体的な詳細はJDKのLinked Blocking Dequeの実現を確認できます.スレッドの安全に関することも考慮しています.ここでは単なる実現で、二重端行列の構造と動作方式を理解しています.
PS:清山緑水は塵から始まります.博学で多くの知識があります.お酒がありますが、話がありますか?微信公衆号:「清塵雑談」.一緒におしゃべりして、コードを話しましょう.
デュアルエンド・キューとは、両端が入隊と出隊操作が可能なキューのことで、dequeは「double ended queue」の略称です.要素はチームの先頭から出てもいいし、入隊もできます.
ツーエンドの列はどうやって実現しますか?
ダブルキューの記憶構造
public class LinkedBlockingDeque {
//
Node first;
//
Node last;
//
int count;
static final class Node {
//
E item;
//
Node prev;
//
Node next;
}
}
隊の先頭から入隊するpublic boolean offerFirst(Node node) {
//
Node f = first;
//
node.next = f;
//
first = node;
// ,
if (last == null)
last = node;
//
else
f.prev = node;
//
++count;
return true;
}
隊の先頭を切るpublic E pollFirst() {
Node f = first;
//
Node n = f.next;
//
E item = f.item;
//
f.item = null;
// ,
f.next = f; // help GC
//
first = n;
//
if (n == null)
last = null;
//
else
n.prev = null;
//
--count;
return item;
}
隊の後尾から入隊するpublic boolean offerLast(Node node) {
//
Node l = last;
if (l == null)
return null;
//
node.prev = l;
//
last = node;
// ,
if (first == null)
first = node;
//
else
l.next = node;
//
++count;
return true;
}
隊の後尾から出るpublic E pollLast() {
Node l = last;
if (l == null)
return null;
//
Node p = l.prev;
//
E item = l.item;
//
l.item = null;
//
l.prev = l; // help GC
//
last = p;
// ,
if (p == null)
first = null;
//
else
p.next = null;
//
--count;
return item;
}
締め括りをつける双端の列は列と同じです.もっと柔軟になっただけで、頭と列の最後は入隊と出隊の操作ができます.ここではチェーンテーブルの二重端列に基づいて実現されています.具体的な詳細はJDKのLinked Blocking Dequeの実現を確認できます.スレッドの安全に関することも考慮しています.ここでは単なる実現で、二重端行列の構造と動作方式を理解しています.
PS:清山緑水は塵から始まります.博学で多くの知識があります.お酒がありますが、話がありますか?微信公衆号:「清塵雑談」.一緒におしゃべりして、コードを話しましょう.