C#環形隊列的完成辦法詳解。本站提示廣大學習愛好者:(C#環形隊列的完成辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#環形隊列的完成辦法詳解正文
1、環形隊列是甚麼
隊列是一種經常使用的數據構造,這類構造包管了數據是依照“先輩先出”的准繩停止操作的,即最早出來的元素也是最早出來的元素.環形隊列是一種特別的隊列構造,包管了元素也是先輩先出的,但與普通隊列的差別是,他們是環形的,即隊列頭部的上個元素是隊列尾部,平日是包容元素數固定的一個閉環。
2、環形隊列的長處
1.包管元素是先輩先出的
是由隊列的性質包管的,在環形隊列中經由過程對隊列的次序拜訪包管。
2.元素空間可以反復應用
由於普通的環形隊列都是一個元素數固定的一個閉環,可以在環形隊列初始化的時刻分派好肯定的內存空間,當進隊或出隊時只須要前往指定元素內存空間的地址便可,這些內存空間可以反復應用,防止頻仍內存分派和釋放的開支。
3.為多線程數據通訊供給了一種高效的機制。
在最典范的臨盆者花費者模子中,假如引入環形隊列,那末生成者只須要生成“器械”然後放到環形隊列中便可,而花費者只須要從環形隊列裡取“器械”而且花費便可,沒有任何鎖或許期待,奇妙的高效完成了多線程數據通訊。
3、C#環形隊列的完成
看了一個數據構造的教程,是用C++寫的,可本身C#照樣一個菜鳥,更別說C++了,但照樣年夜膽測驗考試用C#將個中的環形隊列的完成寫出來,先上代碼:
public class MyQueue<T> : IDisposable { private T[] queue; private int length; private int capacity; private int head = 0; private int tail = 0; public MyQueue(int capacity) { this.capacity = capacity; this.head = 0; this.tail = 0; this.length = 0; this.queue = new T[capacity]; } public void Clear() { head = 0; tail = 0; length = 0; } public bool IsEmpty() { return length == 0; } public bool IsFull() { return length == capacity; } public int Length() { return length; } public bool EnQueue(T node) { if (!IsFull()) { queue[tail] = node; tail = (++tail) % capacity; length++; return true; } return false; } public T DeQueue() { T node = default(T); if (!IsEmpty()) { node = queue[head]; head = (++head) % capacity; length--; } return node; } public void Traverse() { for (int i = head; i < length + head; i++) { Console.WriteLine(queue[i % capacity]); Console.WriteLine($"後面還有{i - head}個"); } } public void Dispose() { queue = null; } }
為了可以或許通用,所以用的是泛型來完成環形隊列類。這裡最主要的是進隊(EnQueue
)和出隊(DeQueue
)兩個辦法,進隊或出隊後頭和尾的地位都要經由過程取模運算來取得,由於是環形隊列嘛,你懂的。
1、簡略類型隊列
好了,測試下入隊:
class Program { static void Main(string[] args) { MyQueue<int> queue = new MyQueue<int>(4); queue.EnQueue(10); queue.EnQueue(16); queue.EnQueue(18); queue.EnQueue(12); queue.Traverse(); Console.Read(); } }
顯示成果:
再測試下出隊:
class Program { static void Main(string[] args) { MyQueue<int> queue = new MyQueue<int>(4); queue.EnQueue(10); queue.EnQueue(16); queue.EnQueue(18); queue.EnQueue(12); queue.Traverse(); Console.WriteLine("彈兩個出去"); queue.DeQueue(); queue.DeQueue(); Console.WriteLine(); queue.Traverse(); Console.Read(); } }
運轉成果:
2、龐雜類型隊列
之前也說了,這個隊列類是用的泛型寫的,對應於C++的模板了,那就意味著任何類型都可使用這個隊列類,來測試個自界說的類嘗嘗,以下先界說一個Customer
類:
public class Customer { public string Name { get; set; } public int Age { get; set; } public void PringInfo() { Console.WriteLine("姓名:" + Name); Console.WriteLine("年紀:" + Age); Console.WriteLine(); } }
然落後行入隊,以下:
class Program { static void Main(string[] args) { MyQueue<Customer> queue = new MyQueue<Customer>(5); queue.EnQueue(new Customer() { Name = "宋小二", Age = 29 }); queue.EnQueue(new Customer() { Name = "陳小三", Age = 28 }); queue.EnQueue(new Customer() { Name = "王小四", Age = 26 }); queue.EnQueue(new Customer() { Name = "朱小五", Age = 48 }); for (int i = 0; i < queue.Length(); i++) { queue[i].PringInfo(); } Console.Read(); } }
下面的代碼 queue[i].PringInfo();
是經由過程索引來完成,所以我們得在隊列類中完成索引,添加以下代碼到MyQueue.cs
類中,以下:
public T this[int index] { get { return queue[index]; } }
感到用for輪回來遍歷照樣不敷好,想用foreach
,那就給MyQueue
類加個遍歷接口,以下:
然後完成這個接口,以下:
public IEnumerator<T> GetEnumerator() { foreach(T node in queue) { if(node != null) { yield return node; } } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
如許遍歷的處所便可以改成foreach
了,以下:
履行成果:
總結:
編程的思惟才是最主要的,有關說話。以上就是這篇文章的全體內容了,願望能對年夜家的進修或許任務帶來必定的贊助,假如有疑問年夜家可以留言交換。