像棧一樣,佇列也是一種線性表。它允許在表的一端插入資料,在另一端刪除元素。插入元素的這一端稱之為隊尾。刪除元素的這一端我們稱之為隊首。佇列的結構如下圖所示。
佇列的特性:
• 在隊尾插入元素,在隊首刪除元素。
• fifo(先進先出),就向排隊取票一樣,先到先拿票
佇列的相關概念
(1)隊頭( front() )與隊尾( back() ): 允許元素插入的一端稱為隊尾,允許元素刪除的一端稱為隊頭。
(2)入隊( push_back() ):佇列的插入操作。
(3)出隊( pop_front() ):佇列的刪除操作。
陣列實現
先來看看陣列實現的方法。棧使用top變數記錄棧頂的位置,而佇列則使用front和rear分別佇列第乙個元素和最後乙個元素的位置。
#define size 20
typedef
struct queue
tyqueue;
入隊、出隊操作很簡單。入隊時,通過rear的位置判斷佇列是否已滿。如果沒有滿,則將rear後移一位,將新元素放置在rear所在位置。出隊時,也可以通過rear的位置判斷佇列是否為空。如果不空,則只需將front後移一位即可。 獲取隊頭元素,判斷佇列不空,則只需返回front指向位置的元素即可。
這樣就完成了佇列的實現嗎?你品,你細品,通過出隊操作將資料彈出佇列後,front之前的空間還能夠再次得到嗎?不能。所以使用普通陣列實現佇列,就再也不能使用front之前的空間了,這會導致大量空間丟失。
迴圈陣列
為了解決這個問題,將普通陣列換成迴圈陣列。在迴圈陣列中,末尾元素的下乙個元素不是陣列外,而是陣列的頭元素。這樣就能夠再次使用front之前的儲存空間了。
但是如果這樣排列就出現了新的問題,那就是無法判斷佇列是否滿了,你品,你細品,那我畫個圖,如下:
所以迴圈佇列中無法用頭尾指標判斷佇列是否滿了。
所以我們要加乙個計數器,具體**如下:
#include
using
namespace std;
#define size 20
typedef
struct queue
tyqueue;
void
initque
(tyqueue *m_q)
void
push_back
(tyqueue *m_q,
int a)
//沒有滿就插入尾巴
if(m_q-
>rear==size)
m_q-
>arr[
(m_q-
>rear)++]
= a;
m_q-
>counter++;}
void
popque
(tyqueue *m_q)
m_q-
>arr[m_q-
>front]=-
1;m_q-
>front++;if
(m_q-
>front >= size)
m_q-
>counter--;}
inttop
(tyqueue *m_q)
else
}void
main()
popque
(&m_que)
;popque
(&m_que)
;popque
(&m_que)
;popque
(&m_que)
;push_back
(&m_que,
2020);
int ncount = m_que.counter;
printf
("count:%d\n"
, ncount)
;int a =20;
for(
int i =
0; i < ncount; i++
)printf
("\n");
system
("pause");
}
結果:
以鍊錶的實現就比較簡單了和之前的棧實現過程類似,就不複述了。
12 資料結構
1.資料結構 有特殊關係的資料的集合 它們之間的關係。2.陣列 array 相同型別元素的有序集合。適合查詢和檢索,不適合插入和刪除。二維陣列 two dimensional arry 的儲存方式 3.記錄 record 可能是不同型別元素的集合。記錄名 記錄 物件 的名字,網域名稱 記錄中各個域 ...
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...