隊列的概念和定義
定義:
隊列是只允許在一端進行插入,另一端進行刪除的線性表。
他所有的插入操作均限定在表的一端進行,該端稱為隊尾。
所有的刪除操作則限定在另一端進行,該端則稱為對頭。
基本操作:
- 入隊:將一個資料插入到隊尾的操作。
- 出隊:讀取隊頭結點資料並刪除該結點的操作
順序隊列的兩個指標與隊列中資料元素的關係圖
迴圈順序隊列
迴圈順序隊列操作
隊列的實現
using System;namespace EveryDayStudy.資料結構{public class DAPQueue{private object[] _array; //存放元素的數組private int _growFactor; //增長因子private int _head;//隊頭指標private const int _MinimumGrow = 4;//最小增長值private const int _ShrinkThreshold = 0x20;//初始容量private int _size;//指示元素個數private int _tail;//隊尾指標public DAPQueue() : this(_ShrinkThreshold, 2f){}public DAPQueue(int capacity,float growFactor){if (capacity<0){throw new ArgumentOutOfRangeException("capacity","初始容量不能小於0");}if (growFactor<1.0|| growFactor>10.0){throw new ArgumentOutOfRangeException("growFactor","增長因子必須在1.0到是10.0之間");}_array = new object[capacity];_head = 0;_tail = 0;_size = 0;_growFactor = (int) (growFactor*100f);}/// <summary>/// 出隊/// </summary>/// <returns></returns>public virtual object Dequeue(){if (_size ==0){throw new InvalidOperationException("隊列為空白。"); //隊下溢}object obj2 = _array[_head];_array[_head] = null;//刪除出隊指標_head = (_head + 1)%_array.Length; //移動隊頭指標_size--;return obj2;}/// <summary>/// 入隊/// </summary>/// <param name="obj"></param>public virtual void Enqueue(object obj){if (_size == _array.Length){int capacity = (int)((_array.Length*_growFactor)/100L);if (capacity <(_array.Length+_MinimumGrow)){capacity = _array.Length + _MinimumGrow;}SetCapacity(capacity);}_array[_tail] = obj;_tail = (_tail + 1)%_array.Length;_size++;}/// <summary>/// 記憶體搬家/// </summary>/// <param name="capacity"></param>private void SetCapacity(int capacity){//在記憶體中開闢新空間object[] destinationArray = new object[capacity];if (_head<_tail){//當頭指標在尾指標前面時Array.Copy(_array,_head,destinationArray,0,_size);}//當頭指標在尾指標後面時else{//先搬頭指標後面的元素再搬數組頭部到尾指標之間的元素Array.Copy(_array, _head, destinationArray, 0, _array.Length - _head);Array.Copy(_array, 0, destinationArray, _array.Length - _head, _tail);}_array = destinationArray;_head = 0;_tail = (_size == capacity) ? 0 : _size;}/// <summary>/// 元素個數/// </summary>public virtual int Count{get{return _size;}}}}