、今日はキューについて学びます
キューといえば、どう思いますか?
カフェテリアの長い行列は、銀行がビジネスを処理するときの待ち行列のままです...
それらはすべて共通の1つの機能を持っています:先着順です!
今日のコンテンツを学習すると、データ構造のキューも同じであることがわかります
ロールアップしましょう!!!
研究カタログ:
1.キューの概念と構造
2.キューの実装
1.キューの概念と構造
キュー:一方の端でのデータ挿入操作ともう一方の端での削除データ操作のみを許可する特別な線形テーブル。キューには先入れ先出し(先入れ先出し)があります。
エンキュー:挿入操作を実行する端は、キューのテールと呼ばれます
デキュー:削除操作を実行する端は、キューの先頭と呼ばれます
注:キューとスタックの違い
スタック:スタックの最上位からのみ挿入および削除でき、ファーストイン、ラストアウトの原則を満たします
キュー:キューの最後から挿入され、先頭から削除され、先入れ先出しの原則を満たします。
2.キューの実装
キューは、配列とリンクリストの構造で実装することもできます。配列の構造を使用すると、先頭でデータをデキューする効率が低下するため、リンクリストの構造を使用することをお勧めします。アレイの。
アレイストレージ:
概要:配列の構造を使用してキューを格納します。挿入する場合、テール挿入時間の複雑さのみがO(1)です。削除する場合、時間計算量がオン)。
リンクリストストレージ:
要約:キューを格納するために単一リンクリストの構造を使用すると、挿入の時間計算量はテール挿入のみを必要とし、削除の時間計算量はヘッド削除のみを必要とし、時間計算量はO(n)です。上の図から、キューは、単一リンクリストが前のノードを見つける必要があるという問題を完全に回避していることがわかります。
それでは、単一リンクリストを使用してキューを実装しましょう!!!
①まず、2つの構造タイプを定義します
typedef int QDataType;
typedef struct QueueNode
{
struct QueueNode* next;
QDataType data;
}QNode;
typedef struct Queue
{
QNode* head;
QNode* tail;
}Queue;
最初の構造タイプQueueNodeはノードであり、2番目のキューはキューの先頭と末尾です
②初期化
//初始化
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = pq->tail = NULL;
}
初期化するとき、キューの先頭と末尾をそれぞれNULLにポイントします
③挿入
//队尾入
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
printf("malloc fail\n");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
if (pq->tail == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
}
④削除
//队头出
void QueuePop(Queue* pq)
{
assert(pq);
assert(pq->head);
//一个 多个
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
}
⑤主導権を握る
//取队头
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(pq->head);
return pq->head->data;
}
まず、キューにデータがあるかどうかをアサートする必要があります。データがない場合は返すことができません。データがある場合は返すことができます。
✧待ち行列の最後をとる
//取队尾
QDataType QueueBact(Queue* pq)
{
assert(pq);
assert(pq->tail);
return pq->tail->data;
}
✧チームにはノードがいくつありますか
//队中数据个数
int QueueSize(Queue* pq)
{
assert(pq);
int size = 0;
QNode* cur = pq->head;
while (cur)
{
++size;
cur = cur->next;
}
return size;
}
⑧空
//判空
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->head == NULL;
}
空の判断にはbool型を使用します。bool型はtrueとfalseです。
⑨破壊
//销毁
void QueueDestory(Queue* pq)
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
QNode* next = cur;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
}
破棄することの利点は、メモリリークの問題を防ぐことです。
この問題は以上です
以下のコメントを歓迎します!!!