數據結構之環形隊列實現 (C++/數組)
1.概念示意圖
內存中不存在環形數據結構,均由基礎結構實現邏輯上的閉環效果
2.環形隊列與普通隊列的區別
1.front頭部指針
一般隊列:front頭部指針初始值爲-1,從隊列取數據時,該值依次遞增,指向的元素即待取出的數據,而隊列的頭部數據所在的指針位置爲front+1。當front=maxSize-1時,隊列最後一個數據取出,此時隊列爲空。
環形隊列:front頭部指針初始值爲0,指向的元素既是隊列的頭部數據也是待取出的數據。從隊列取數據時,因邏輯上的閉環,指針可能再次回到前面的位置,不能單一遞增處理,需通過取模來重新計算指針的值。
2.rear尾部指針
一般隊列:rear尾部指針初始值爲-1,隊列添加數據時,該值依次遞增,當rear=maxSize-1時,隊列滿,無法再添加數據。
環形隊列:rear尾部指針初始值爲0,指向待添加數據的位置,隊列添加數據時,因邏輯上的閉環,指針可能再次回到前面的位置,不能單一遞增處理,會出現角標越界異常,需通過取模來重新計算指針的值。
3.隊列空的判斷邏輯
一般隊列:rear == front時,隊列空。
環形隊列:rear == front時,隊列空。
4.隊列滿的判斷邏輯
一般隊列:rear = maxSize - 1時,隊列滿。
環形隊列:(rear + 1) % maxSize == front時,隊列滿。
3.代碼實現
#include <iostream>
#include <cstdlib>
#include <memory.h>
class Ciclequeue
{
public:
//隊列最大容量
int m_maxSize;
//隊列頭指針
int m_frontIdx;
//隊列尾指針
int m_rearIdx;
//隊列數組
int *m_queueArr;
public:
//構造函數
Ciclequeue(int tmpSize)
{
m_maxSize = tmpSize;
m_frontIdx = 0;
m_rearIdx = 0;
m_queueArr = new int[m_maxSize];
memset(m_queueArr, 0 , sizeof(int)*m_maxSize);
}
//析構函數
~Ciclequeue()
{
delete m_queueArr;
m_queueArr = NULL;
}
//入隊
void enqueue(int datavalue)
{
if(isfull())
{
std::cout<<"Queue is full!"<<std::endl;
return;
}
m_queueArr[m_rearIdx] = datavalue;
m_rearIdx = (m_rearIdx + 1)%m_maxSize;
}
//出隊
void dequeue()
{
if(isempty())
{
std::cout<<"Queue is empty!"<<std::endl;
return;
}
m_queueArr[m_frontIdx] = -1; //模擬出隊列動作
m_frontIdx = (m_frontIdx + 1)%m_maxSize;
}
//檢查隊列是否已滿
bool isfull()
{
if(m_maxSize == -1)
{
std::cout<<"Create queue error!"<<std::endl;
return false;
}
return (m_rearIdx + 1)%m_maxSize == m_frontIdx;
}
//檢查隊列是否爲空
bool isempty()
{
if(m_maxSize == -1)
{
std::cout<<"Create queue error!"<<std::endl;
return false;
}
return m_rearIdx == m_frontIdx;
}
//當前隊列元素各個數
int size()
{
return (m_rearIdx - m_frontIdx + m_maxSize) % m_maxSize;
}
//顯示隊列
void showqueue()
{
if(isempty())
{
return;
}
for(int i = m_frontIdx; i < m_frontIdx + size(); i++ )
{
std::cout<<m_queueArr[i]<<" "<<std::endl;
}
}
//顯示隊列頭
void showqueuefront()
{
std::cout<<m_queueArr[m_frontIdx]<<std::endl;
}
};
int main(int argc, char **argv)
{
int tmpSize = std::atoi(argv[1]);
if(tmpSize <= 0)
{
std::cout<<"Set MaxSize Error!"<<std::endl;
return 0;
}
Ciclequeue *testqueue = new Ciclequeue(tmpSize);
testqueue->enqueue(3);
testqueue->enqueue(2);
testqueue->dequeue();
testqueue->enqueue(4);
testqueue->dequeue();
testqueue->enqueue(5);
testqueue->enqueue(66);
testqueue->enqueue(88);
testqueue->enqueue(1204);
testqueue->showqueue();
delete testqueue;
testqueue = NULL;
return 0;
}