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了,以下:

履行成果:

總結:
編程的思惟才是最主要的,有關說話。以上就是這篇文章的全體內容了,願望能對年夜家的進修或許任務帶來必定的贊助,假如有疑問年夜家可以留言交換。