佇列(queue)是限定在表的一端進行插入,表的另一端進行刪除的資料結構。先進先出。
//結點定義
typedef
struct nodenode;
//佇列定義,隊首指標和隊尾指標
typedef
struct queuequeue;
初始化將頭尾兩個結點指向空,表示是乙個空佇列
//初始化結點
node *
init_node()
return n;
}//初始化佇列
queue *
init_queue()
//頭尾結點均賦值null
q->front=
null
; q->rear=
null
;return q;
}
判空: (直接就是判斷佇列頭指標是否是空值即可)
q->front==null;
入隊需要特判一下佇列是否為空。
如果隊列為空的話,需要將頭指標和尾指標一同指向第乙個結點,即front=n;rear=n。
不為空的時候,我們只需要將尾結點向後移動,通過不斷移動next指標指向新的結點構成佇列即可。
//入隊操作
void
push
(queue *q,
int data)
else
}
出隊
隊列為空,直接結束;
在佇列不為空的情況下, 將佇列的頭指標指向頭指標當前指向的下乙個元素並釋放掉當前元素;
佇列只有乙個元素了(即頭尾指標均指向了同乙個結點),直接將頭尾兩指標制空(null)並釋放這乙個結點。
void
pop(queue *q)
if(q->front==q->rear)
else
}
遍歷
佇列不為空的情況下,通過結點的next指向依次遍歷並輸出元素
printf
("%d\t"
,n->data)
;n=n->next;
"假溢位": 佇列用的儲存區還沒有滿,但佇列卻發生了溢位。
(出隊操作頭指標後移,入隊尾指標後移,頭部儲存空置)
優化:給定佇列的大小範圍,在原有佇列的基礎上,只要佇列的後方滿了,就從這個佇列的前面開始進行插入,以達到重複利用空間的效果。
由於迴圈佇列的設計思維更像乙個環,因此常使用乙個環圖來表示,但注意其不是乙個真正的環,迴圈佇列依舊是單線性的。
資料結構設計
#define maxsize 10
//表示迴圈佇列的最大容量
//迴圈佇列的結構設計
typedef
struct cir_queuecir_queue;
初始化
//初始化
cir_queue *
init()
q->front=0;
q->rear=0;
return q;
}
入隊
#define maxsize 10
//表示迴圈佇列的最大容量
//入隊操作push
void
push
(cir_queue *q,
int data)
else
}
出隊
將front指標後移一位
//出隊操作pop
void
pop(cir_queue *q)
else
}
遍歷
借助乙個臨時變數儲存位置front的位置資訊,利用i逐步向後移動,直到i到達了rear的位置,遍歷結束。
//遍歷佇列
void
print
(cir_queue *q)
}
資料結構 七 佇列
1 佇列需要具備的特性 佇列和棧的底層實現資料結構可以是 陣列 鍊錶,只不過在此基礎上,佇列和棧需要過載兩個函式 節點的插入與刪除函式。佇列只能從煉表頭刪除節點,從鍊錶末尾插入節點 2 示例 ifndef data struct queue h define data struct queue h ...
資料結構與演算法(13) 佇列
定義 佇列是一種只能在一端插入 隊尾 在另一端刪除 隊首 的有序線性表。佇列的第乙個插入的元素也是第乙個被刪除的元素。所以,佇列是一種先進先出 fifo,first in first out 或後進後出 lilo,last in last out 線性表。佇列操作的專有名稱 向佇列中插入乙個元素,稱...
資料結構與演算法 6 佇列
引導 今天我們進入最後一章資料結構的學習 佇列。通過前面幾篇的學習,我們已經了解到了陣列,鍊錶,棧等資料結構。資料結構就是堆特定問題進行抽象話的東西,內容並不多。後面就開始介紹利用這些基礎的資料結構加上演算法來解決特定的問題。佇列佇列和棧都是抽象的資料結構,是乙個操作受限的線性表。它的特點就是先進先...