隊列的連結儲存結構——鏈隊列
圖解:
LinkQueue.h
//LinkQueue.h#ifndef LINKQUEUE_H#define LINKQUEUE_Htemplate <class T>struct Node{ T data; Node<T> *next; //此處<T>也可以省略};template <class T>class LinkQueue{public: LinkQueue( ); //建構函式,初始化一個空的鏈隊列 ~LinkQueue( ); //解構函式,釋放鏈隊列中各結點的儲存空間 void EnQueue(T x); //將元素x入隊 T DeQueue( ); //將隊頭元素出隊 T GetQueue( ); //取鏈隊列的隊頭元素 bool Empty( ); //判斷鏈隊列是否為空白private: Node<T> *front, *rear; //隊頭和隊尾指標,分別指向頭結點和終端結點};#endif;
LinkQueue.cpp
//LinkQueue.cpp#include "LinkQueue.h"/* * 前置條件:隊列不存在 * 輸 入:無 * 功 能:初始化隊列 * 輸 出:無 * 後置條件:建立一個空隊列 */template <class T>LinkQueue<T>::LinkQueue( ){Node <T> *s;s=new Node<T>;s->next=NULL;front=rear=s;}/* * 前置條件:隊列存在 * 輸 入:無 * 功 能:銷毀隊列 * 輸 出:無 * 後置條件:釋放隊列所佔用的儲存空間 */template <class T>LinkQueue<T>::~LinkQueue( ){while(front){Node <T> *p;p=front->next; delete front; front=p;}}/* * 前置條件:隊列已存在 * 輸 入:元素值s * 功 能:在隊尾插入一個元素 * 輸 出:無 * 後置條件:如果插入成功,隊尾增加了一個元素 */template <class T> void LinkQueue<T>::EnQueue(T x){Node<T> *s; s=new Node<T>; s->data=x; //申請一個資料域為x的結點s s->next=NULL; rear->next=s; //將結點s插入到隊尾 rear=s;}/* * 前置條件:隊列已存在 * 輸 入:無 * 功 能:刪除隊頭元素 * 輸 出:如果刪除成功,返回被刪元素值,否則,拋出刪除異常 * 後置條件:如果刪除成功,隊頭減少了一個元素 */template <class T>T LinkQueue<T>::DeQueue(){ Node <T> *p; int x; if (rear==front) throw "下溢"; p=front->next; x=p->data; //暫存隊頭元素 front->next=p->next; //將隊頭元素所在結點摘鏈 if (p->next==NULL) rear=front; //判斷出隊前隊列長度是否為1 delete p; return x;}/* * 前置條件:隊列已存在 * 輸 入:無 * 功 能:讀取隊頭元素 * 輸 出:若隊列不空,返回隊頭元素 * 後置條件:隊列不變 */template <class T> T LinkQueue<T>::GetQueue(){ if (front!=rear) return front->next->data;}/* * 前置條件:隊列已存在 * 輸 入:無 * 功 能:判斷隊列是否為空白 * 輸 出:如果隊列為空白,返回1,否則,返回0 * 後置條件:隊列不變 */template <class T> bool LinkQueue<T>::Empty( ){ if(front==rear) return 1; else return 0;}