//基於數組的隊列實現 public class MyArrayQueue<T> { private T[] items; private int size; private int head; private int tail; public MyArrayQueue(int capacity) { this.items = new T[capacity]; this.size = 0; this.head = this.tail = 0; } /// <summary> /// 入隊 /// </summary> /// <param name="item">入隊元素</param> public void EnQueue(T item) { if (Size == items.Length) // 擴大數組容量 ResizeCapacity(items.Length * 2); items[tail] = item; tail++; size++; } /// <summary>v /// 出隊 /// </summary> /// <returns>出隊元素</returns> public T DeQueue() { if (size == 0) return default(T); T item = items[head]; items[head] = default(T); head++; if (head > 0 && Size == items.Length / 4) ResizeCapacity(items.Length / 2); size--; return item; } /// <summary> /// 重置數組大小 /// </summary> /// <param name="newCapacity">新的容量</param> public void ResizeCapacity(int newCapacity) { T[] newItems = new T[newCapacity]; int index = 0; if (newCapacity > items.Length) { for (int i = 0; i < items.Length; i++) newItems[index++] = items[i]; } else { for (int i = 0; i < items.Length; i++) { if (!items[i].Equals(default(T))) { newItems[index++] = items[i]; } } head = tail = 0; } items = newItems; } /// <summary> /// 棧是否為空 /// </summary> /// <returns>true/false</returns> public bool IsEmpty() { return this.size == 0; } /// <summary> /// 棧中節點個數 /// </summary> public int Size { get { return this.size; } } }
public class Node<T> { public T Item { get; set; } public Node<T> Next { get; set; } public Node(T item) { this.Item = item; } public Node() { } } /// <summary> /// 基於鏈表的隊列實現 /// </summary> /// <typeparam name="T">類型</typeparam> public class MyLinkQueue<T> { private Node<T> head; private Node<T> tail; private int size; public MyLinkQueue() { this.head = null; this.tail = null; this.size = 0; } /// <summary> /// 入隊操作 /// </summary> /// <param name="node">節點元素</param> public void EnQueue(T item) { Node<T> oldLastNode = tail; tail = new Node<T>(); tail.Item = item; if (IsEmpty()) { head = tail; } else { oldLastNode.Next = tail; } size++; } /// <summary> /// 出隊操作 /// </summary> /// <returns>出隊元素</returns> public T DeQueue() { T result = head.Item; head = head.Next; size--; if (IsEmpty()) { tail = null; } return result; } /// <summary> /// 是否為空隊列 /// </summary> /// <returns>true/false</returns> public bool IsEmpty() { return this.size == 0; } /// <summary> /// 隊列中節點個數 /// </summary> public int Size { get { return this.size; } } }
class Program { static void Main(string[] args) { // 01.基於鏈表的隊列 QueueWithLinkListTest(); // 02.基於數組的隊列 //QueueWithArrayTest(); } #region Method01.基於鏈表的隊列的測試 /// <summary> /// 基於鏈表的隊列的測試 /// </summary> static void QueueWithLinkListTest() { MyLinkQueue<int> queue = new MyLinkQueue<int>(); Console.WriteLine("Is Empty:{0}", queue.IsEmpty()); Random rand = new Random(); // 順序插入5個元素 for (int i = 0; i < 5; i++) { int num = rand.Next(1, 10); queue.EnQueue(num); Console.WriteLine("{0} enqueue.", num); } Console.WriteLine("Size:{0}", queue.Size); Console.WriteLine("-------------------------"); // 5個元素依次出隊 for (int i = 0; i < 5; i++) { Console.WriteLine("{0} dequeue.", queue.DeQueue()); } Console.WriteLine("Size:{0}", queue.Size); Console.WriteLine("-------------------------"); // 順序插入10個元素 for (int i = 0; i < 10; i++) { int num = rand.Next(1, 10); queue.EnQueue(num); Console.WriteLine("{0} enqueue.", num); } Console.WriteLine("Size:{0}", queue.Size); Console.WriteLine("-------------------------"); // 10個元素依次出隊 for (int i = 0; i < 10; i++) { Console.WriteLine("{0} dequeue.", queue.DeQueue()); } Console.WriteLine("Size:{0}", queue.Size); } #endregion #region Method02.基於數組的隊列的測試 /// <summary> /// 基於數組的隊列的測試 /// </summary> static void QueueWithArrayTest() { MyArrayQueue<int> queue = new MyArrayQueue<int>(5); Console.WriteLine("Is Empty:{0}", queue.IsEmpty()); Console.WriteLine("Size:{0}", queue.Size); Random rand = new Random(); // Test1.1:順序插入5個數據元素 for (int i = 0; i < 5; i++) { int num = rand.Next(1, 10); queue.EnQueue(num); Console.WriteLine("{0} enqueue.", num); } Console.WriteLine("Is Empty:{0}", queue.IsEmpty()); Console.WriteLine("Size:{0}", queue.Size); // Test1.2:臨時插入1個數據元素驗證數組是否擴容 queue.EnQueue(rand.Next(1, 20)); Console.WriteLine("Size:{0}", queue.Size); Console.WriteLine("-------------------------"); // Test2.1:前5個元素出隊 for (int i = 0; i < 5; i++) { Console.WriteLine("{0} dequeue.", queue.DeQueue()); } Console.WriteLine("Is Empty:{0}", queue.IsEmpty()); Console.WriteLine("Size:{0}", queue.Size); Console.WriteLine("-------------------------"); // Test2.2:最后一個數據元素出隊驗證數組是否收縮容量 queue.DeQueue(); Console.WriteLine("Size:{0}", queue.Size); Console.WriteLine("-------------------------"); queue.DeQueue(); } #endregion }