C++迴圈佇列
阿新 • • 發佈:2018-12-01
佇列如果使用鏈式儲存結構則很容易實現,但是佇列一般用於對大量資料進行頻繁的入隊和出隊操作,若採用鏈式儲存結構,則要頻繁對記憶體進行分配和去配操作,開銷很大,效率很低,因此如果要頻繁的入隊或出隊操作時,鏈式結構是不合適的,而採用順序儲存結構的迴圈佇列則很好的解決了這個問題。
MyQueue.h
#pragma once class MyQueue { public: MyQueue(int items);//引數items為打算存放的資料量 virtual ~MyQueue(); bool EnQueue(int data); bool DeQueue(int* pRecvData=nullptr); void DeTraverse();//遍歷佇列中儲存的資料元素 int GetSize();//獲取佇列中的資料量 bool IsFull(); bool IsEmpty(); private: int* pArr; int head,tail; int length;//佇列的實際長度 };
MyQueue.cpp
#include "MyQueue.h" #include <iostream> using namespace std; MyQueue::MyQueue(int items) { this->length = items + 1;//必須多開闢一個空間,因為尾指標要指向這個空間 pArr = new int[this->length]; head = tail = 0; } MyQueue::~MyQueue() { delete[]pArr; } bool MyQueue::EnQueue(int data) { if (IsFull()) { cout<<"佇列已滿!"<<endl; return false; } pArr[tail] = data; tail = (tail + 1) % length; return true; } bool MyQueue::DeQueue(int* pRecvData) { if (IsEmpty()) { cout << "佇列為空!" << endl; return false; } if (pRecvData != nullptr) *pRecvData = pArr[head]; head = (head+1) % length; return true; } int MyQueue::GetSize() { return (tail - head + length) % length; } bool MyQueue::IsFull() { return (tail + 1) % length == head; } bool MyQueue::IsEmpty() { return head == tail; } void MyQueue::DeTraverse() { if (head == tail) { cout << "佇列為空!" << endl; return; } for (int i = head; i != tail; i = (i + 1) % length) cout << pArr[i] << " "; cout << endl; }
main.cpp(測試程式碼)
#include <iostream> using namespace std; #include "MyQueue.h" int main() { MyQueue que(5); cout<<"que的資料量為:" <<que.GetSize()<< endl; que.EnQueue(1); que.EnQueue(2); que.EnQueue(3); que.EnQueue(4); que.EnQueue(5); que.DeQueue(); que.EnQueue(6); cout << "que的資料量為:" << que.GetSize() << endl; que.DeTraverse(); //que.DeQueue(); //cout << "que的資料量為:" << que.GetSize() << endl; //que.DeTraverse(); //que.DeQueue(); //que.DeQueue(); //que.DeQueue(); //que.DeQueue(); //que.DeQueue(); //que.EnQueue(5); //cout << "que的資料量為:" << que.GetSize() << endl; getchar(); return 0; }