隊列(循環隊列)

聲明:圖片及內容基於https://www.bilibili.com/video/av94331942ios

原理分析

數據結構

FIFO:先進先出數據結構

front指向頭元素的前一個位置ide

rear指向最後一個元素函數

若是用rear=front來判斷隊列爲空仍是滿,會出現歧義,其實沒法判斷spa

 

此時,若再插入一個元素,則rear=front。code

爲了解決這個問題,本問採起留出一個空間不用的策略。及隊列容量始終比開闢空間少一。blog

基本數據類型

class CirQueue { private: T* data; int front; int rear; int mSize; public: CirQueue(); CirQueue(int size); ~CirQueue(); bool enQueue(T item); //入隊 bool deQueue(T &item); //出隊 bool getFront(T& item);//得到隊頭 bool isEmpty(); bool isFull(); void clearQueue(); void displayQueue(); int queueLength(); //得到隊列長度 class Out_of_range{}; //異常類 class Empty{}; //異常類 }; 

隊列初始化

template<class T> CirQueue<T>::CirQueue() { front = rear = 0; mSize = QUEUESIZE; data = new T[mSize]; }
template<class T> CirQueue<T>::CirQueue(int size) { mSize = size; front = rear = 0; data = new T[mSize]; }

析構函數

CirQueue<T>::~CirQueue() { delete[] data; }

入隊(尾入)

而使用循環隊列能夠解決此問題,充分利用空間。隊列

bool CirQueue<T>::enQueue(T item) { if (isFull()) throw Out_of_range(); rear = (rear + 1) % mSize; //實現循環隊列 data[rear] = item; return true; }

出隊(頭出)

template<class T> bool CirQueue<T>::deQueue(T& item) { if (isEmpty()) throw Empty(); front = (front + 1) % mSize; item = data[front]; return true; }

獲取頭元素

template<class T>
bool CirQueue<T>::getFront(T& item) { if (isEmpty()) throw Empty(); int i = (front + 1) % mSize; item = data[i]; return true; }

判斷是否爲空

rear = front時爲空圖片

template<class T>
bool CirQueue<T>::isEmpty() { if (rear ==front) return true; return false; }

判斷是否爲滿

template<class T>
bool CirQueue<T>::isFull() { if ((rear + 1) % mSize == front) return true; return false; }

清空隊列

void CirQueue<T>::clearQueue() { front = rear = 0; }

打印隊列

template<class T>
void CirQueue<T>::displayQueue() { if (isEmpty()) { cout << "隊列爲空" << endl; return; } int i = (front + 1) % mSize; while (1) { //當front=head時表示下標到達最後一個元素,打印完這個元素之後再退出 cout << data[i] << " "; if (i == rear) break; i = (i + 1) % mSize; } cout << endl; }

獲取隊列長度

template<class T>
int CirQueue<T>::queueLength() { int length = (rear + mSize - front) % mSize; return length; }

完整代碼

#include<iostream>
using namespace std; const int QUEUESIZE = 100; template <class T>
class CirQueue { private: T* data; int front; int rear; int mSize; public: CirQueue(); CirQueue(int size); ~CirQueue(); bool enQueue(T item); bool deQueue(T &item); bool getFront(T& item); bool isEmpty(); bool isFull(); void clearQueue(); void displayQueue(); int queueLength(); class Out_of_range{}; class Empty{}; }; template<class T> CirQueue<T>::CirQueue() { front = rear = 0; mSize = QUEUESIZE; data = new T[mSize]; } template<class T> CirQueue<T>::CirQueue(int size) { mSize = size; front = rear = 0; data = new T[mSize]; } template<class T> CirQueue<T>::~CirQueue() { delete[] data; } template<class T>
bool CirQueue<T>::enQueue(T item) { if (isFull()) throw Out_of_range(); rear = (rear + 1) % mSize; data[rear] = item; return true; } template<class T>
bool CirQueue<T>::deQueue(T& item) { if (isEmpty()) throw Empty(); front = (front + 1) % mSize; item = data[front]; return true; } template<class T>
bool CirQueue<T>::getFront(T& item) { if (isEmpty()) throw Empty(); int i = (front + 1) % mSize; item = data[i]; return true; } template<class T>
bool CirQueue<T>::isEmpty() { if (rear ==front) return true; return false; } template<class T>
bool CirQueue<T>::isFull() { if ((rear + 1) % mSize == front) return true; return false; } template<class T>
void CirQueue<T>::clearQueue() { front = rear = 0; } template<class T>
void CirQueue<T>::displayQueue() { if (isEmpty()) { cout << "隊列爲空" << endl; return; } int i = (front + 1) % mSize; while (1) { cout << data[i] << " "; if (i == rear) break; i = (i + 1) % mSize; } cout << endl; } template<class T>
int CirQueue<T>::queueLength() { int length = (rear + mSize - front) % mSize; return length; } int main(){ try { CirQueue<int> Queue(3); /*Queue.enQueue(1); Queue.enQueue(2);*/
        //int de ; //Queue.deQueue(de); //cout << de << endl; //Queue.displayQueue(); //if (Queue.isFull()) cout << "full"; //cout << Queue.queueLength(); //Queue.clearQueue();
 Queue.displayQueue(); } catch (CirQueue<int>::Out_of_range) { cout << "已經滿了" << endl; } catch (CirQueue<int>::Empty) { cout << "爲空" << endl; } return 0; }
相關文章
相關標籤/搜索