キューの定義
キュー:これは、一方の端でのみデータを挿入し、もう一方の端でデータを削除できる特別な線形テーブルです。キューには先入れ先出し法があります。
キューの基本操作
エンキュー:挿入操作の終了は、キューの終了と呼ばれます
デキュー:削除操作の終了は、チームのヘッドと呼ばれます
キューはシーケンシャルテーブル(配列)とリンクリストの構造で実現することもできます。これは、キューがサポートしているためです。挿入とヘッダーの削除を終了します、したがって、リンクリストはキューを実装するのにより適しています
キューの実装
C言語のヘッドポインタとテールポインタを含む単一リンクリストは、キューを実装します。
キューの定義
typedef int Data;
typedef struct queuenode{
Data data;
struct queue* _next;
}queuenode;
typedef struct queue{
queuenode* _start;
queuenode* _end;
}queue;
キューの初期化
void init(queue* qe){
qe->_end = qe->_start = NULL;
}
キューの拡張
queuenode* createqe(Data data){
queuenode* node = (queuenode*)malloc(sizeof(queuenode));
node->data = data;
node->_next = NULL;
}
エンキューとデキュー
//入队(尾插)
void push(queue* qe, Data data){
queuenode* newqueue=createqe(data);
if (qe->_end == qe->_start == NULL){
qe->_end = qe->_start = newqueue;
}
else{
qe->_end->_next = newqueue;
qe->_end = newqueue;
}
}
//出队(头删)
void pop(queue* qe){
if (qe->_end == NULL){
return;
}
queuenode* next = qe->_start->_next;
free(qe->_start);
qe->_start = next;
//删除之后是否为空表
if (qe->_end == NULL){
qe->_end = NULL;
//避免end变为野指针
}
}
チームの頭または尾を取得します
//获取队头元素
int top(queue* qe){
return qe->_start->data;
}
int last(queue* qe){
return qe->_end->data;
}
要素の数を取得します
/获取数量
int size(queue* qe){
if (qe->_end == NULL){
return 0;
}
int i = 0;
queuenode* cur = qe->_start;
while (cur){
i++;
cur = cur->_next;
}
return i;
}
キューを破棄します
void destory(queue* qe)
{
assert(qe);
queuenode* cur = qe->_start;
while (cur)
{
queuenode* next = cur->_next;
free(cur);
cur = next;
}
qe->_start = qe->_end = NULL;
}