實現隊列的方法很多,比如動態數組、鏈表,今天主要介紹迴圈隊列
首先說用靜態數組實現簡單隊列。
很顯然,當隊列滿後,即便全部元素都出隊,隊列還是滿的狀態。這種情況就叫做“假溢出”,即數組中明明有可用空間,但卻無法使用。
這是由定長數組的特性決定的。但我們可用改變一下思路,當隊尾指標指向數組最後一個位置時,如果再有資料入隊,並且隊頭指標沒有指向數組的第一個元素,那麼就讓隊為指標繞回到數組頭部。這樣就形成了一個邏輯上的環。
這樣,只要隊列中實際的元素數量小於數組長度減一,就可以繼續入隊了。
其實這是一個非常簡單的資料結構,痛點就是判斷隊空、對滿,以及計算隊列長度。
1const int MAX_QUEUE_SIZE = 5;
2template<typename T>
3class cyc_queue
4{
5public:
6 cyc_queue()
7 :m_nHead(0),
8 m_nTail(0)
9 {}
10
11
12 //如對操作, 將資料追加到隊列頭部,並改變隊首指標,如隊成功,則返回true
13 bool in_queue(const T & data)
14 {
15 if(full())
16 //隊列滿
17 {
18 return false;
19 }
20
21 m_array[m_nTail] = data;
22 m_nTail = (m_nTail + 1) % MAX_QUEUE_SIZE;
23 }
24
25 //出隊操作,將隊首資料複製並返回,改變隊首指標
26 T out_queue()
27 {
28 if(empty())
29 {
30 throw("隊列已空");
31 }
32
33 T temp = m_array[m_nHead];
34 m_nHead = (m_nHead + 1) % MAX_QUEUE_SIZE;
35 return temp;
36 }
37
38 bool empty()
39 {
40
41 return m_nTail == m_nHead;
42 }
43
44 bool full()
45 {
46 return (m_nTail + 1) % MAX_QUEUE_SIZE == m_nHead;
47 }
48
49 size_t size()
50 {
51 return (m_nTail - m_nHead + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
52 }
53private:
54 T m_array[MAX_QUEUE_SIZE];
55 int m_nHead;
56 int m_nTail;
57};