數據結構之環形隊列實現 (C++/數組)

數據結構之環形隊列實現 (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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章