首頁 > 軟體

C++ Queue佇列類模版範例詳解

2022-02-25 19:01:47

1.佇列的介紹

佇列的定義

  • 佇列(Queue)是一種線性儲存結構。它有以下幾個特點:
  • 按照"先進先出(FIFO, First-In-First-Out)"方式進出佇列。
  • 佇列只允許在"隊首"進行取出操作(出佇列),在"隊尾"進行插入操作(入佇列 )

佇列實現的方式有兩種

  • 基於動態陣列實現
  • 基於連結串列形式實現

佇列需要實現的函數

  • T dequeue() : 出佇列,並返回取出的元素
  • void enqueue(const T &t) : 入佇列
  • T &head() : 獲取隊首資料,但是不會被取出
  • const T &head() const : 獲取const型別隊首資料
  • int length() const: 獲取數量(父類別已經實現)
  • void clear(): 清空佇列(父類別已經實現)

2.程式碼實現

本章,我們實現的佇列基於連結串列形式實現,它的父類別是我們之前實現的LinkedList類:

C++ 雙向迴圈連結串列類模版範例詳解

所以Queue.h程式碼如下:

#ifndef QUEUE_H
#define QUEUE_H
#include "throw.h"
// throw.h裡面定義了一個ThrowException拋異常的宏,如下所示:
//#include <iostream>
//using namespace std;
//#define ThrowException(errMsg)  {cout<<__FILE__<<" LINE"<<__LINE__<<": "<<errMsg<<endl; (throw errMsg);}
#include "LinkedList.h"
template < typename T>
class Queue : public LinkedList<T>
{
public:
    inline void enqueue(const T &t) { LinkedList<T>::append(t); }
    inline T dequeue()
    {
        if(LinkedList<T>::isEmpty()) {        // 如果棧為空,則拋異常
            ThrowException("Stack is empty ...");
        }
        T t = LinkedList<T>::get(0);
        LinkedList<T>::remove(0);
        return t;
    }
    inline T &head()
    {
        if(LinkedList<T>::isEmpty()) {        // 如果棧為空,則拋異常
            ThrowException("Stack is empty ...");
        }
        return LinkedList<T>::get(0);
    }
    inline const T &head() const
    {
        if(LinkedList<T>::isEmpty()) {        // 如果棧為空,則拋異常
            ThrowException("Stack is empty ...");
        }
        return LinkedList<T>::get(0);
    }
};
#endif // QUEUE_H

3.測試執行

int main(int argc, char *argv[])
{
    Queue<int> queue;
    cout<<"******* current length:"<<queue.length()<<endl;
    for(int i = 0; i < 5; i++) {
        cout<<"queue.enqueue:"<<i<<endl;
        queue.enqueue(i);
    }
    cout<<"******* current length:"<<queue.length()<<endl;
    while(!queue.isEmpty()) {
        cout<<"queue.dequeue:"<<queue.dequeue()<<endl;
    }
    return 0;
}

執行列印:

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!   


IT145.com E-mail:sddin#qq.com