程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#環形隊列的完成辦法詳解

C#環形隊列的完成辦法詳解

編輯:C#入門知識

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

履行成果:

總結:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved