佇列的基本操作——鏈式佇列的類模板定義
阿新 • • 發佈:2019-01-02
定義
佇列(Queue)是隻允許在一端進行插入,而在另一端進行刪除的運算受限的線性表
(1)允許刪除的一端稱為隊頭(Front)。
(2)允許插入的一端稱為隊尾(Rear)。
(3)當佇列中沒有元素時稱為空佇列。
(4)佇列亦稱作先進先出(First In First Out)的線性表,簡稱為FIFO表。
佇列的修改是依先進先出的原則進行的。新來的成員總是加入隊尾(即不允許"加塞"),每次離開的成員總是佇列頭上的(不允許中途離隊),即當前"最老的"成員離隊。
【例】在佇列中依次加入元素a1,a2,…,an之後,a1是隊頭元素,an是隊尾元素。退出佇列的次序只能是a1 ,a2,…,an。
"Queue.h"
<span style="font-size:18px;color:#000000;">#pragma once #include <iostream> using namespace std; #include "assert.h" typedef int DataType; template<class T> struct Node { DataType _data; struct Node<T>* _next; Node(const T& data) :_data(data) ,_next(NULL) {} }; template<class T> class Queue { public: Queue()//建構函式 :_head(NULL) ,_tail(NULL) ,_size(0) {} ~Queue()//解構函式 { if (_head) { delete _head; } if (_tail) { delete _tail; } } void Push(const T& data)//入隊 { if (_head == NULL) { _head = _tail = new Node<T> (data); } else { _tail->_next = new Node<T> (data); _tail = _tail->_next; } ++_size; } void Pop()//出隊 { if (Empty() == true) { printf("Queue is Empty\n"); return; } else { Node<T>* del = _head; _head = _head->_next; delete del; } --_size; } void PrintQueue()//列印佇列 { if (Empty() == true) { return; } Node<T>* pNode = NULL; pNode = _head; while(pNode != _tail) { cout<<pNode->_data<<" "; pNode = pNode->_next; } cout<<pNode->_data<<endl; } T& Front()//返回佇列的對頭元素 { //assert(_head); return _head->_data; } T& Back()//返回佇列的隊尾元素 { //assert(_tail); return _tail->_data; } protected: bool Empty()//判斷佇列是否為空 { return _size == 0; } size_t Size()//佇列的長度 { return _size; } private: Node<T>* _head;//隊頭指標 Node<T>* _tail;//隊尾指標 size_t _size;//佇列長度 }; </span>
"test.cpp"
<span style="font-size:18px;color:#000000;">#define _CRT_SECURE_NO_WARNINGS 1 #include "queue.h" void test() { Queue<int> queue; queue.Push(1); queue.Push(4); queue.Push(7); queue.Push(9); queue.PrintQueue(); queue.Pop(); queue.Pop(); queue.PrintQueue(); int ret = queue.Back()-queue.Front(); cout<<ret<<endl; } int main() { test(); system("pause"); return 0; }</span>