誰かが主な違いを説明してもらえますか? どの言語のプログラミングでも、これらの関数について明確な知識はありません。
6 に答える
C や C++ などのプログラミング言語の基本的なデータ構造には、スタックとキューがあります。
スタック データ構造は、スタックに挿入または「プッシュ」された最初の要素が、スタックから削除または「ポップ」される最後の要素である「先入れ後出し」ポリシー (FILO) に従います。
同様に、キューのデータ構造は「先入れ先出し」ポリシーに従います (カウンターの列に並ぶときの通常のキューの場合と同様)。最初の要素がキューにプッシュされるか、「エンキュー」され、同じキューから削除する必要がある場合の要素は「Dequeued」です。
これは、スタックのプッシュとポップに非常に似ていますが、エンキューとデキューという用語は、使用中のデータ構造がスタックかキューかに関する混乱を避けるためのものです。
クラス コーダーには、エンキューとデキューのプロセスを示す簡単なプログラムがあります。参考までに調べてみてはいかがでしょう。
http://classcoders.blogspot.in/2012/01/enque-and-deque-in-c.html
Enqueue
キューに対する操作でDequeue
ある傾向があり、まさにそのように聞こえるデータ構造です。
ちょうど最新のテイラー・スウィフトのコンサートのチケットを求めて列に並ぶ人々のように、一方の端でアイテムをエンキューし、もう一方の端でデキューします (最初はビリー・ジョエルと言うつもりでしたが、それは私をひどくデートさせます)。
どちらかの側でエンキューおよびデキューできる両端キューなどのキューのバリエーションがありますが、大多数はより単純な形式になります。
+---+---+---+
enqueue -> | 3 | 2 | 1 | -> dequeue
+---+---+---+
この図は、番号 1、2、3 をこの順序でキューに入れ、まだデキューしていないキューを示しています。
enqueue
例として、とdequeue
関数を使用して動作中の単純なキューを示す Python コードを次に示します。より深刻なコードであれば、クラスとして実装されますが、動作を説明するには十分なはずです。
import random
def enqueue(lst, itm):
lst.append(itm) # Just add item to end of list.
return lst # And return list (for consistency with dequeue).
def dequeue(lst):
itm = lst[0] # Grab the first item in list.
lst = lst[1:] # Change list to remove first item.
return (itm, lst) # Then return item and new list.
# Test harness. Start with empty queue.
myList = []
# Enqueue or dequeue a bit, with latter having probability of 10%.
for _ in range(15):
if random.randint(0, 9) == 0 and len(myList) > 0:
(itm, myList) = dequeue(myList)
print(f"Dequeued {itm} to give {myList}")
else:
itm = 10 * random.randint(1, 9)
myList = enqueue(myList, itm)
print(f"Enqueued {itm} to give {myList}")
# Now dequeue remainder of list.
print("========")
while len(myList) > 0:
(itm, myList) = dequeue(myList)
print(f"Dequeued {itm} to give {myList}")
実行中のサンプルを示します。
Enqueued 70 to give [70]
Enqueued 20 to give [70, 20]
Enqueued 40 to give [70, 20, 40]
Enqueued 50 to give [70, 20, 40, 50]
Dequeued 70 to give [20, 40, 50]
Enqueued 20 to give [20, 40, 50, 20]
Enqueued 30 to give [20, 40, 50, 20, 30]
Enqueued 20 to give [20, 40, 50, 20, 30, 20]
Enqueued 70 to give [20, 40, 50, 20, 30, 20, 70]
Enqueued 20 to give [20, 40, 50, 20, 30, 20, 70, 20]
Enqueued 20 to give [20, 40, 50, 20, 30, 20, 70, 20, 20]
Dequeued 20 to give [40, 50, 20, 30, 20, 70, 20, 20]
Enqueued 80 to give [40, 50, 20, 30, 20, 70, 20, 20, 80]
Dequeued 40 to give [50, 20, 30, 20, 70, 20, 20, 80]
Enqueued 90 to give [50, 20, 30, 20, 70, 20, 20, 80, 90]
========
Dequeued 50 to give [20, 30, 20, 70, 20, 20, 80, 90]
Dequeued 20 to give [30, 20, 70, 20, 20, 80, 90]
Dequeued 30 to give [20, 70, 20, 20, 80, 90]
Dequeued 20 to give [70, 20, 20, 80, 90]
Dequeued 70 to give [20, 20, 80, 90]
Dequeued 20 to give [20, 80, 90]
Dequeued 20 to give [80, 90]
Dequeued 80 to give [90]
Dequeued 90 to give []
これらは、「先入れ先出し」である「FIFO」キューを説明するときに通常使用される用語です。これは線のように機能します。あなたは映画に行くことにしました。チケットを購入するための長い列があり、チケットを購入するためにキューに入ることにしました。これが「エンキュー」です。ある時点で列の先頭にいて、チケットを購入し、その時点で列を離れます。これが「Dequeue」です。
キューは特定の両面データ構造です。一方の側に新しい要素を追加し、もう一方の側から要素を削除できます (一方の側しかないスタックとは対照的に)。エンキューとは要素を追加すること、デキューとは要素を削除することを意味します。こちらをご覧ください。
エンキューとは要素を追加すること、デキューとは要素を削除することを意味します。
var stackInput= []; // First stack
var stackOutput= []; // Second stack
// For enqueue, just push the item into the first stack
function enqueue(stackInput, item) {
return stackInput.push(item);
}
function dequeue(stackInput, stackOutput) {
// Reverse the stack such that the first element of the output stack is the
// last element of the input stack. After that, pop the top of the output to
// get the first element that was ever pushed into the input stack
if (stackOutput.length <= 0) {
while(stackInput.length > 0) {
var elementToOutput = stackInput.pop();
stackOutput.push(elementToOutput);
}
}
return stackOutput.pop();
}