C++實現資料結構-佇列
阿新 • • 發佈:2019-02-10
最近學了C++,看了下資料結構的東西,這裡就跟大家分享一下自己用C++實現佇列的一些思想和經驗,適合初學者交流學習。
佇列分類
佇列在資料結構中分為普通佇列和環形佇列。首先說說普通佇列,就是一種類似隧道的資料結構,對於佇列裡的資料,是先入先出,這點和棧相反。但是普通佇列有些缺點,下面來說說普通佇列缺點。
普通佇列的資料從對頭開始離開的時候,後面一個記憶體空間會變為新的隊頭,那麼對頭離開後剩下的記憶體空間就被剩下了,這就讓記憶體空間利用率不高。但是環形佇列就可以很好的解決這個問題,但是有點難哈。
所以,下面程式設計都是圍繞環形佇列展開(環形佇列就是一個換,這個環裡可以分配記憶體空間,資料在環裡進行排隊,對頭刪了,又可以加上新的資料變為隊偉,這樣記憶體的使用率就增加了)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行更加實用的資料型別,進行遍歷環形佇列。