1. 程式人生 > >C++實現資料結構-佇列

C++實現資料結構-佇列

最近學了C++,看了下資料結構的東西,這裡就跟大家分享一下自己用C++實現佇列的一些思想和經驗,適合初學者交流學習。

  1. 佇列分類
    佇列在資料結構中分為普通佇列和環形佇列。首先說說普通佇列,就是一種類似隧道的資料結構,對於佇列裡的資料,是先入先出,這點和棧相反。但是普通佇列有些缺點,下面來說說普通佇列缺點。
    普通佇列的資料從對頭開始離開的時候,後面一個記憶體空間會變為新的隊頭,那麼對頭離開後剩下的記憶體空間就被剩下了,這就讓記憶體空間利用率不高。但是環形佇列就可以很好的解決這個問題,但是有點難哈。
    所以,下面程式設計都是圍繞環形佇列展開(環形佇列就是一個換,這個環裡可以分配記憶體空間,資料在環裡進行排隊,對頭刪了,又可以加上新的資料變為隊偉,這樣記憶體的使用率就增加了)

  2. C++類中定義的函式分析

#ifndef Queue_h_
#define Queue_h_

class Queue
{
public:
    Queue(int QueueCapaticy);//建構函式來產生一個記憶體空間,用來存放佇列
    ~Queue();//解構函式用來釋放記憶體空間
    void clearQueue();//清楚佇列裡的資料
    bool  emptyQueue() const;//判斷佇列是否為空佇列
    int QueueLen();//返回值為佇列長度
    bool enterQueue(int element);//資料進入佇列
    bool deleteQueue(int
element);//刪除佇列裡的資料 bool fullQueue();//判斷佇列是否滿狀態,滿了就不能插入資料了 void travelQueue();//遍歷數列裡的資料 private: int m_iQueueCapaticy;//佇列儲存記憶體空間大小 int m_iQueueLen;//記錄佇列長度 int m_iHead;//佇列頭 int m_iTail;//佇列尾 int* m_pQueue;//佇列指標 }; #endif
  • 各個成員函式的實現
#include <iostream>
using namespace std
; #include "Queue.h" Queue::Queue(int QueueCapaticy)//分配記憶體空間儲存佇列 { m_iQueueCapaticy = QueueCapaticy; m_pQueue = new int[m_iQueueCapaticy];//堆上分配記憶體空間 m_iHead = 0; m_iTail = 0; m_iQueueLen = 0; } Queue::~Queue() { delete[]m_pQueue; m_pQueue = NULL; } void Queue::clearQueue() { m_iQueueLen = 0; m_iHead = 0; m_iTail = 0; } bool Queue::emptyQueue() const { return m_iQueueLen == 0 ? true : false; } int Queue::QueueLen()//返回值為佇列長度 { return m_iQueueLen; } void Queue::enterQueue(int element)//資料進入佇列 { if (fullQueue()==false) { m_pQueue[m_iTail] = element; m_iTail++; m_iTail = m_iTail%m_iQueueCapaticy; m_iQueueLen++; } } void Queue::deleteQueue(int element)//刪除佇列裡的資料 { if (emptyQueue() == false) { m_pQueue[m_iHead] = element; m_iHead++; m_iHead= m_iHead%m_iQueueCapaticy; m_iQueueLen--; } } bool Queue:: fullQueue()//判斷佇列是否滿狀態,滿了就不能插入資料了 { return m_iQueueLen == m_iQueueCapaticy ? true : false; } void Queue::travelQueue()//遍歷數列裡的資料 { for (int i = m_iHead; i < m_iHead + m_iQueueLen; i++) { cout << m_pQueue[i%m_iQueueCapaticy] << endl; } }
  • 下面是主函式,在主函式中例項化物件,就可以對環形佇列進行操作。
#include <iostream>
#include "Queue.h"
using namespace std;


int main()
{
    Queue *p = new Queue(4);
    p->enterQueue(1);
    p->enterQueue(2);
    p->enterQueue(3);
    p->enterQueue(4);

    p->deleteQueue(5);
    //p->deleteQueue(6);
    cout << p->QueueLen() << endl;

    p->enterQueue(6);


    p->travelQueue();

    delete p;
    p = NULL;
    system("pause");
    return 0;
}

上述程式碼產生的環形佇列中資料是int型別,在C++面向物件思想下,可以將int型資料變為自己想要的型別,下篇部落格將分享一個比int行更加實用的資料型別,進行遍歷環形佇列。