資料結構–迴圈隊列

來源:互聯網
上載者:User

實現隊列的方法很多,比如動態數組、鏈表,今天主要介紹迴圈隊列

首先說用靜態數組實現簡單隊列。

很顯然,當隊列滿後,即便全部元素都出隊,隊列還是滿的狀態。這種情況就叫做“假溢出”,即數組中明明有可用空間,但卻無法使用。

這是由定長數組的特性決定的。但我們可用改變一下思路,當隊尾指標指向數組最後一個位置時,如果再有資料入隊,並且隊頭指標沒有指向數組的第一個元素,那麼就讓隊為指標繞回到數組頭部。這樣就形成了一個邏輯上的環。

這樣,只要隊列中實際的元素數量小於數組長度減一,就可以繼續入隊了。

其實這是一個非常簡單的資料結構,痛點就是判斷隊空、對滿,以及計算隊列長度。

 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};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.