第3の構造 - 待ち行列(キュー)
最後のキュー・スタック、先入れ先出し(FIFO)直線状の第1とは対照的です。読み取り時に書いときに露出のみの尾は、唯一頭が露出しました。
キューだけの配列を実装します。その理由は、最初のノードとテールは2つの操作を挿入、削除、単純なキューのリンクリストは非常にシンプルですが、これはもはや、実装になることはありません。
スタックは固定端としての特性を持たないようにキューのアレイは、メモリユニットは、キューのヘッドがデキュー動作を移動するように、必要に応じてアレイのためのスペースを再利用することができる、固定されています。各デキューの全内容は、削除のためのコストの点で操作のO(n)の複雑さキューユニットを転送する場合には大きすぎます。したがって、我々は、要素自体を移動しませんが、デキュー操作として、2によって識別されたキュー(フロント)とテール(リア)の頭部を示す後方正面を移動すること。その結果、尾部が配列の終わりに達することの前に空のスペース、バックヘッドスペースを使用してアレイ。即ちループ配列を形成します。
この時点で、我々はそれが満杯であるかどうか、それは空で、フロントとリアのキューの長さの大小関係によって知ることができます。
特に注目すべき点であるサイクル後、我々はフロントが決定されたときに、キューのどのように多くの異なる長さの合計が形成することができる想像し、?
明らかに、値の数はリア取ることができる配列の長さ(Mという)等しいです。すなわちである、対応するキューの長さが0、1、2、3、ことができる ...、M-1。 これは問題であり、長さmの配列、形成される環構造の後にキューが最大長さで表すことができます。 M-1です。
私たちは、なぜ考えることを望むかもしれません。我々は長さMのアレイを使用する場合、実際には、mがあれば、キューの最大長を表します。
最初の要素の位置を示す(I)フロント、リアは、最後の要素の位置を示します。だから我々は状況空のキューを表すことはできません。
前面および背面が一致したときに最初の要素(リンクされたリストの最初のノードと同様に、実際のデータが保存されていない)前の位置を示す(II)フロントは、次に、mはキューの長さとして表すことができない、空のキューを示します。位置が前にあるものをどんなにので、いくらキューの長さ、データを保存しない位置は常にありません。最後の要素の後に後方位置は、上述したように、それはもはや単一ではない同じ示す(III)。
このように、キューの最大長nを作成するには、(N + 1)*はsizeof(のElementType)配列スペースを適用する必要があります。一見ナンセンスがそう言うに降り、それは考えることができる非常に簡単なようだが、キューに精通していない実際には、キューは準備がこれを無視達成する可能性があります。
空の第1の具体素子のセル(フロント示す)または最後の要素の後(後に示す)は、有意な影響前として。次の実装では、著者はかつての実施形態を使用しています。
コードは以下のとおりであります
// Queue.h する#include <stdio.hに> する#include <stdlib.h>に含ま 構造体QueueRecord。 typedefは構造体QueueRecord *キュー。 int型のisEmpty(キューQ); int型IsFull(キューQ); キューCreateQueue(int型MaxElements)。 空DisposeQueue(キューQ); 空MakeEmpty(キューQ); 空エンキュー(のElementType X、キューQ); ElementTypeフロント(キューQ); 空デキュー(キューQ); ElementType FrontAndDequeue(キューQ);
// Queue.c の#include "Queue.h" のstruct QueueRecord { int型の容量; フロントをint型。 int型リア; int型のサイズ。 ElementType *アレイ。 }。 int型のisEmpty(キューQ) { Q->サイズ== 0を返します。 } INT IsFull(キューQ) { Q->サイズ== Q->容量を返します。 } (MaxElements INT)キューCreateQueue { キューRET。 もし((RET =(キュー)はmalloc(はsizeof(構造体QueueRecord)))== NULL) { のprintf( "エラーメモリ不足\ N!!"); NULLを返します。 } IF((ret->配列=(のElementType *)はmalloc(はsizeof(のElementType)*(1 + MaxElements)))== NULL) { のprintf( "エラーメモリ不足\ N!!"); 無料(RET)。 NULLを返します。 } ret->キャパシティ= MaxElements。 ret->サイズ= 0; ret->フロント= ret->リア= 0; RETを返します。 } ボイドDisposeQueue(キューQ) { IF(Q) { フリー(Q->アレイ)。 無料(Q); } } ボイドMakeEmpty(キューQ) { Q->リア= Q->フロント。 Q->サイズ= 0; } 無効エンキュー(のElementType X、キューQ) { int型のT。 場合(IsFull(Q)) { のprintf( "エラーキューがいっぱいになっている\ nは!"); 返します。 } 、T =(Q->リア+ 1)%(Q->容量+ 1)。 Q->行列[T] =のX; Q->リア= T; Q->サイズ+ = 1; } のElementTypeフロント(キューQ) { 場合(のisEmpty(Q)) { のprintf( "エラーキューが空である\ nは!"); 0を返します。 } 戻り(Q->アレイ)[Q->フロント]。 } 無効デキュー(キューQ) { 場合(のisEmpty(Q)) { のprintf( "エラーキューが空である\ nは!"); 返します。 } Q->フロント=(Q->フロント+ 1)%(Q->容量+ 1)。 Q->サイズ- = 1; } ElementType FrontAndDequeue(キューQ) { のElementTypeのRET。 もし(のisEmpty(Q)) { のprintf( "エラーキューが空である\ nは!"); 0を返します。 } RET =(Q->アレイ)[Q->フロント]。 Q->フロント=(Q->フロント+ 1)%(Q->容量+ 1)。 Q->サイズ- = 1; RETを返します。 }