帝国CMS模板大全
www.admin99.cn
www.92cms.cn 帝国CMS模板下载站!,情怀,养站,二次开发!源码需求比较大的一站式会员下载,价更省!!!

C#环形队列的实现方法详解

一、环形队列是什么

队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。

二、环形队列的优点

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

执行结果:

总结:

编程的思想才是最重要的,无关语言。以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

dy(“nrwz”);

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《C#环形队列的实现方法详解》
文章链接:https://www.admin99.cn/7674
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
QQ站长交流群:953950264

登录

找回密码

注册