データ構造(C言語バージョン)---キュー

1.キュー:テーブルの一方の端に挿入し、テーブルのもう一方の端で削除します。挿入を許可する端はキューの末尾であり、削除を許可する端はキューの先頭です。先入れ先出しFIFO。

2.キューの基本操作

InitQueue(&Q):空のキューを作成します

DestroyQueue(&Q):キューを破棄

ClearQueue(&Q):キューをクリアします

QueueEmpty(Q):キューが空かどうかを判別

QueueLength(Q):キューの長さを見つける

GetHead(Q、&e):eを使用してキューの先頭要素を返します

EnQueue(&Q、e):キューの新しい末尾としてeを挿入します

DeQueue(&Q、&e):ヘッド要素を削除してeで戻る

3.キューの順次ストレージ:連続ストレージユニット。2つのポインターが前のヘッドエレメントを示し、後部がテールエレメントの次の位置を示します。

1)循環キュー:順次キューをリングスペースに変更します。

(1)空のキューを初期化する場合:フロント=リア= 0

(2)新しいキューテール要素が挿入されるたびに、rear =(rear + 1)%maxsize

(3)ヘッド要素が削除されるたびに、front =(front + 1)%naxsize

(4)空でないキューでは、ヘッドポインターは常にキューのヘッドエレメントを指し、テールポインターは常にキューのテールエレメントの次の位置を指します。

(5)キューの長さ:(リア+ maxsize-front)%maxsize

2)キュースペースが「空」か「満杯」かを確認します。

(1)キューが「空」か「満杯」かを区別するタグを設定します。初期タグ= 0、キューエントリ成功タグ= 1、チーム終了成功タグ= 0。

         空のチーム:要素を削除したため、リア==フロント&&タグ== 0;チームがいっぱい:要素を挿入したため、リア==フロント&&タグ== 1

(2)1つ少ない要素スペースを使用し、「キューの先頭がキューのテールポインターの次の位置にある(リングの次の位置を参照)」ということを、キューの「フル」の記号として同意します。

         空のチーム:リア==フロント;チームフル:(リア+ 1)%maxsize ==フロント;チーム内の要素数:(リア+ maxsize-front)%maxsize

(3)カウンターカウントを設定します。初期カウント= 0、チームへのカウントカウント+1、チームからのカウント-1です。

          队空:count == 0;队满:count> 0 && rear == front

3)キューのシーケンシャルストレージタイプの説明
#define Maxsize 50
typedef struct {
 int data [Maxsize];
 int front、ear ;
 int tag = 0; //フラグビットを設定する必要がない場合は、宣言できません。
} SqQueue;
初期状態(チームが空の状態):Q.front == Q.rear == 0;チームに入る操作:チームに不満がある場合は、チームのテールとチームのテールポインターを挿入します+1;チームヘッドエレメントの値、ヘッドポインター+1を取ります。
4)シーケンシャルストレージでのいくつかの基本操作の実現

(1)
void initqueueを初期化します(SqQueue&Q)
{
 Q.rear = Q.front = 0;
}
(2)キューが空であると判断します
bool queueempty(SqQueue Q)
{
 if(Q.rear == Q.front)
 {
  return true ;
 }
 else
 {
  return false;
 }
}
(3)
Enrollment bool enqueue(SqQueue&Q、int e)
{
 if((Q.rear + 1)%Maxsize == Q.front)
 {
  return false;
 }
 Q.data [Q.rear] = e;
 Q.rear =(Q.rear + 1)%Maxsize;
 return true;
}
(4)タグ付きのキューキュー
enqueue bool enqueue2(SqQueue&Q、int e)
{
 if (Q.front == Q.rear && Q.tag == 1)
 {
  falseを返します。
 }
 Q.data [Q.rear] = e;
 Q.rear =(Q.rear + 1)%Maxsize;
 Q.tag = 1;
 trueを返します。
}
(5)出队
bool dequeue(SqQueue&Q、int&e)
{
 if(Q.rear == Q.front)
 {
  return false;
 }
 e = Q.data [Q.front];
 Q.front =(Q.front + 1)%Maxsize;
 trueを返します。
}
(6)设有タグ标志的循環环队列出队
bool dequeue2(SqQueue&Q、int&e)
{
 if(Q.front == Q.rear && Q.tag == 0)
 {
  return false;
 }
 e = Q.data [Q.front];
 Q.front =(Q.front + 1)%Maxsize;
 Q.tag = 0;
 trueを返します。
}

4.両端キュー:テーブルの両端で挿入および削除操作が実行される線形テーブルを制限します。

1)出力が制限されたダブルエンドキュー:1つのエンドポイントは挿入と削除を許可し、もう1つのエンドポイントは挿入のみを許可します。

2)入力が制限されたダブルエンドキュー:1つのエンドポイントは挿入と削除を許可し、もう1つのエンドポイントは削除のみを許可します。

5.キューのチェーンストレージ

1)リンクキュー:リンクリストで表されるキュー、ヘッドポインター(チームのヘッドを指す)とテールポインター(チームの終わりを指す)を含む単一のリンクリスト。

2)チェーンキューにヘッドノードがある場合、テールポインターとヘッドポインターの両方がヘッドノードを指すと、チェーンキューのテールは空になります。

3)キューのチェーンストレージタイプの説明
typedef struct {
 int data;
 struct Linkqueuenode * next;
} Linkqueuenode;
typedef struct {
 Linkqueuenode * front、*
Rear;} Linkqueue;
//Q.front==null&&Q.rear==null、チェーンキューが空です。
4)チェーンストレージでのいくつかの基本操作の実現

(1)初始化
void initqueue(Linkqueue&Q)
{
 Q.front = Q.rear =(Linkqueuenode *)malloc(sizeof(Linkqueuenode));
 Q.front-> next = NULL;
}
(2)列が空か どうかを
判断queueempty(Linkqueue Q)
{
if(Q.rear == Q.front)
 {
  return true;
 }
 else
 {
  falseを返します。
 }
}
(3)入力队
void enqueue(Linkqueue&Q、int e)
{
 Linkqueuenode * s =(Linkqueuenode *)malloc(sizeof(Linkqueuenode));
 s-> data = e;
 s-> next = NULL;
 Q.rear-> next = s-> next;
 Q.リア= s;
}
(4)出队
bool dequeue(Linkqueue&Q、int&e)
{
 if(Q.front == Q.rear)
 {
  falseを返す;
 }
 Linkqueuenode * p = Q.front;
 e = p-> data;
 Q.front-> next = p-> next;
 if(Q.rear == p)
 {
  Q.rear = Q.front;
 }
 free(p);
 trueを返します。
}

おすすめ

転載: www.cnblogs.com/xqy1874/p/12746000.html