4,泛型环形队列
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace 数据结构 6 { 7 public class CircleQueue<T> 8 { 9 //队列最大容量 10 private int maxSize; 11 //队列头 12 private int front; 13 //队列尾 14 private int rear; 15 //队列数组 16 private T[] arrayQueue; 17 //队列尾下一位置,如果和头部重合说明队列已满 18 //所以队列尾部会空一个位置,这样判断队列是否为空好处理一些 19 public bool IsFull { get => (rear + 1) % maxSize == front; } 20 //头尾同时指向同一位置为空 21 public bool IsEmpty { get => front == rear; } 22 //队列剩余数据 23 public int Size { get => (maxSize + rear - front) % maxSize; } 24 25 public CircleQueue(int maxSize = 1) 26 { 27 //由于队列留空了一格,所以最大值要加一 28 this.maxSize = maxSize + 1; 29 arrayQueue = new T[this.maxSize]; 30 //指向队列头 31 this.front = 0; 32 //指向队列尾的下一个位置,也就三队列头部 33 this.rear = 0; 34 } 35 //入队 36 public bool AddQueue(T item) 37 { 38 if (IsFull) 39 { 40 Console.WriteLine("队列已满..."); 41 return false; 42 } 43 arrayQueue[rear] = item; 44 //尾指向下一位置 45 rear = (rear + 1) % this.maxSize; 46 return true; 47 } 48 //出队 49 public T GetQueue() 50 { 51 if (IsEmpty) 52 { 53 throw new IndexOutOfRangeException("队列为空..."); 54 55 } 56 //头指向下一位置 57 var val = arrayQueue[front]; 58 front = (front + 1) % this.maxSize; 59 return val; 60 } 61 } 62 public class CircleQueueGenericDemo 63 { 64 static void Main(string[] args) 65 { 66 //初始化队列 67 var queue = new CircleQueue<string>(9); 68 Console.WriteLine($"泛型当前队列长度为{queue.Size}"); 69 Console.WriteLine("向长度为9的入队10个字符串\n"); 70 for (int i = 1; i <= 10; i++) 71 { 72 73 if (queue.IsFull) 74 { 75 Console.Write("队列已满“10string”入队失败,"); 76 break; 77 } 78 if (queue.AddQueue($"string{i}")) 79 { 80 Console.Write($"string{i}\t"); 81 } 82 83 } 84 Console.WriteLine($"当前队列长度为{queue.Size}\t"); 85 86 87 Console.WriteLine("出队5个字符串...\n"); 88 for (int i = 1; i <= 5; i++) 89 { 90 91 Console.Write($"{queue.GetQueue()}\t"); 92 93 } 94 Console.WriteLine($"当前队列长度为{queue.Size}\n"); 95 } 96 } 97 }