zoukankan      html  css  js  c++  java
  • 队列c#版

    一. 顺序队列

      在顺序队列中,我们维护一个头指针和尾指针来避免每一次出队都要移动数组,而仅仅在入队时发现空间不足时,在尝试进行移动数组操作,将空余的位置利用起来。

        public class MyQueue<T>
        {
            T[] data;  // 数据
            int front = 0;  // 前指针
            int rear = 0;   // 后指针
    
            public MyQueue(int size)
            {
                data = new T[size];
            }
    
            /// <summary>
            /// 入队
            /// </summary>
            /// <param name="model"></param>
            public void Enqueue(T model)
            {
                if (rear < data.Length)
                    data[rear] = model;
                else
                {
                    if (front > 0)
                    {
                        Move();
                        data[rear] = model;
                    }
                    else
                        throw new ArgumentOutOfRangeException("超出队列长度");
                }
                
                rear++;
            }
    
            
    
            /// <summary>
            /// 出队
            /// </summary>
            /// <returns></returns>
            public T Dequeue()
            {
                T result = default(T);
                if (rear > front)
                    result = data[front];
                else
                    throw new NullReferenceException("队列中没有值");
                front++;
                return result;
            }
    
            public bool IsEmpty()
            {
                return front == rear;
            }
    
            public bool IsFull()
            {
                return rear == data.Length;
            }
    
            public int Length => data.Length;
    
            public int ItemLength => rear - front;
    
            private void Move()
            {
                var itemlength = ItemLength;
                // 移动队列,将下标为0的前数组填满
                for (int i = 0; i < itemlength; i++)
                {
                    data[i] = data[front];
                    front++;
                }
                front = 0;
                rear = itemlength;
            }
    View Code

    测试代码:

     1 try
     2  {
     3         MyQueue<int> queue = new MyQueue<int>(3);
     4         queue.Enqueue(1);
     5         queue.Enqueue(2);
     6         queue.Enqueue(3);
     7         for (int i = 0; i < queue.Length; i++)
     8         {
     9             Console.WriteLine(queue.Dequeue());
    10          }
    11          queue.Enqueue(4);
    12          queue.Enqueue(5);
    13          queue.Enqueue(6);
    14          Console.WriteLine(queue.Dequeue());
    15          queue.Enqueue(7);
    16          Console.WriteLine(queue.Dequeue());
    17          Console.WriteLine(queue.Dequeue());
    18          queue.Enqueue(8);
    19          queue.Enqueue(9);
    20          queue.Enqueue(10);
    21          queue.Enqueue(11);
    22 }
    23 catch (ArgumentOutOfRangeException e)
    24 {
    25         Console.WriteLine(nameof(ArgumentOutOfRangeException) + e.Message);
    26 }
    27 catch (NullReferenceException e)
    28 {
    29         Console.WriteLine(nameof(NullReferenceException) + e.Message);
    30 }    
    View Code
  • 相关阅读:
    3个检测浏览器UserAgent信息的网站
    linux系统下配置网桥(CentOS 5.5)
    squid封禁不带UserAgent的请求
    iptables透明网桥无法使用透明代理错误
    Squid修改用户浏览器的Useragent信息
    MySQL主从复制(MasterSlave)与读写分离(MySQLProxy)实践
    js中格式化时间
    js获取当前月的第一天和最后一天
    JS String.toDate
    Js获取当前日期时间及其它操作
  • 原文地址:https://www.cnblogs.com/LTEF/p/12468145.html
Copyright © 2011-2022 走看看