亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#環形隊列的實現方法詳解

2020-01-24 00:59:00
字體:
來源:轉載
供稿:網友

一、環形隊列是什么

隊列是一種常用的數據結構,這種結構保證了數據是按照“先進先出”的原則進行操作的,即最先進去的元素也是最先出來的元素.環形隊列是一種特殊的隊列結構,保證了元素也是先進先出的,但與一般隊列的區別是,他們是環形的,即隊列頭部的上個元素是隊列尾部,通常是容納元素數固定的一個閉環。

二、環形隊列的優點

 1.保證元素是先進先出的

        是由隊列的性質保證的,在環形隊列中通過對隊列的順序訪問保證。

 2.元素空間可以重復利用

       因為一般的環形隊列都是一個元素數固定的一個閉環,可以在環形隊列初始化的時候分配好確定的內存空間,當進隊或出隊時只需要返回指定元素內存空間的地址即可,這些內存空間可以重復利用,避免頻繁內存分配和釋放的開銷。

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

執行結果:

總結:

編程的思想才是最重要的,無關語言。以上就是這篇文章的全部內容了,希望能對大家的學習或者工作帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久91| 在线播放亚洲激情| 97不卡在线视频| 久久久久久国产精品三级玉女聊斋| 亚洲精品美女在线观看播放| 精品亚洲国产成av人片传媒| 92版电视剧仙鹤神针在线观看| 日韩在线观看免费全| 97香蕉久久夜色精品国产| 欧美一性一乱一交一视频| 日韩av大片在线| 亚洲电影免费在线观看| 久久久人成影片一区二区三区观看| 国产一区二区黄| 欧美午夜宅男影院在线观看| 亚洲欧美国产高清va在线播| 亚洲欧美激情视频| 欧美另类老肥妇| 2019最新中文字幕| 成人欧美一区二区三区黑人| 91精品91久久久久久| 视频在线观看99| 2019中文字幕在线免费观看| x99av成人免费| 日韩在线中文视频| 国产精品专区第二| 欧美福利视频网站| 中国人与牲禽动交精品| 亚洲激情中文字幕| 国产91热爆ts人妖在线| 国产97人人超碰caoprom| 久久夜色撩人精品| 亚洲天堂av高清| 亚洲成人久久久久| 亚洲色图偷窥自拍| 中日韩午夜理伦电影免费| 日韩第一页在线| 欧美一区二区三区精品电影| 欧美一区二区三区四区在线| 日本精品久久电影| 欧美成人精品在线视频| 欧美精品www| 欧美激情中文网| 一区二区成人av| 亚洲精品资源在线| 欧美专区福利在线| 欧美资源在线观看| 中文一区二区视频| 欧洲美女免费图片一区| 日韩激情在线视频| 欧美多人爱爱视频网站| 成人美女av在线直播| 国产精自产拍久久久久久蜜| 日韩欧美中文字幕在线观看| 日韩欧美在线一区| 亚洲欧美综合精品久久成人| 这里只有精品在线观看| 欧美激情视频给我| 色综合伊人色综合网| 欧美性xxxxxxx| 一区二区在线免费视频| 亚洲精品suv精品一区二区| 社区色欧美激情 | 日本高清+成人网在线观看| 九九精品视频在线| 91av视频导航| 欧美极品少妇xxxxⅹ裸体艺术| 国产成人精品在线视频| 欧美肥臀大乳一区二区免费视频| 国产在线999| 国产成人avxxxxx在线看| 国产午夜精品视频| 国产精品高清在线| 欧美乱人伦中文字幕在线| 91精品国产高清久久久久久久久| 欧美亚洲日本黄色| 国产成人精品久久二区二区| 亚洲精品www久久久久久广东| 欧美日韩精品在线| 久久成人精品一区二区三区| 成人亚洲欧美一区二区三区| 日韩精品极品视频| 久久国产精品网站| 日韩一区二区三区在线播放| 亚洲激情视频在线播放| 欧美一区二区三区……| 亚洲免费电影在线观看| xxx成人少妇69| 久久精品国产成人| 亚洲最大福利视频| 另类少妇人与禽zozz0性伦| 国产视频在线一区二区| 成人黄色影片在线| 国产91精品久久久久久| 久久久久久久久久久网站| 成人国产亚洲精品a区天堂华泰| 久久中文精品视频| 欧美高清一级大片| 欧美日韩国产成人在线观看| 久久免费视频在线观看| 91大神福利视频在线| 欧美在线日韩在线| 日韩av在线播放资源| 亚洲成人a**站| 亚洲精品综合精品自拍| 欧美日韩国产第一页| 亚洲自拍小视频免费观看| 日韩成人av在线| www.日韩视频| 欧美在线视频网站| 国产自摸综合网| 亚洲免费福利视频| 亚洲精品美女网站| 韩国v欧美v日本v亚洲| 国产亚洲精品高潮| 欧美成人免费播放| 亚洲国产日韩欧美在线动漫| 2019中文字幕在线| 亚洲欧洲国产一区| 精品久久久久久国产91| 国产精品美女无圣光视频| 在线日韩中文字幕| 国产亚洲精品成人av久久ww| 久久全国免费视频| 高清欧美电影在线| 欧美日韩免费区域视频在线观看| 国产精品亚洲美女av网站| 亚洲国语精品自产拍在线观看| 久久久久国产视频| 国产成人精品一区二区在线| 中文字幕在线视频日韩| 亚洲精品一区二区久| 亚洲网在线观看| 亚洲国产高清福利视频| 亚洲电影免费观看高清完整版在线| 久久99青青精品免费观看| 98视频在线噜噜噜国产| 欧美日韩国产中字| 色狠狠av一区二区三区香蕉蜜桃| 97精品视频在线| 国产91精品在线播放| 国产91热爆ts人妖在线| 97视频在线观看亚洲| 91精品免费看| 国产中文字幕亚洲| 97色在线视频观看| 在线免费看av不卡| 97热在线精品视频在线观看| 欧美日韩亚洲成人| 精品久久久久久久久久久久| 欧美视频精品一区| 日韩在线免费观看视频| 久久久噜噜噜久久中文字免| 日韩av在线高清| 91人人爽人人爽人人精88v| 亚洲欧美国产精品| 精品国产视频在线| 综合久久五月天| 欧美性猛交xxxx| 美女av一区二区| 97国产精品人人爽人人做| 国产精品久久婷婷六月丁香| 成人亲热视频网站| 成人有码在线视频|