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 }

 

posted @ 2020-04-12 01:42  小橘·Huang  阅读(154)  评论(0编辑  收藏  举报