05 队列(C#实现)

时间:2023-03-31 19:36:13

介绍

在 C# 中,队列(Queue 类)是一种线性数据结构,它代表了一个先进先出的对象集合[1](http://c.biancheng.net/csharp/queue.html)。当您需要对项目进行先进先出访问时,则可以使用队列[2](https://www.runoob.com/csharp/csharp-queue.html)。队列的出口端叫作队头(front),队列的入口端叫作队尾(rear)[3](https://zhuanlan.zhihu.com/p/315212925)

当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队[2](https://www.runoob.com/csharp/csharp-queue.html)。队列接受 null 作为引用类型的有效值,并且可以根据需要自动增加容量[4](https://zhuanlan.zhihu.com/p/486127721)

C# 还提供了 ConcurrentQueue 类,它是一个高效的线程安全的队列,适用于多线程环境[5](https://blog.csdn.net/qq_41230604/article/details/126305068)

代码示例

using System;
using System.Collections.Generic;

namespace _03_QueueTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue<int> queue = new Queue<int>();
            //入队
            queue.Enqueue(23);//队首
            queue.Enqueue(25);
            queue.Enqueue(67);
            queue.Enqueue(89);
            Console.WriteLine("添加了23 25 67 89 之后队列的大小为:"+queue.Count);
            //出队(取得队首的数据,并删除)
            int i = queue.Dequeue();
            Console.WriteLine("取得的数据为:"+i);
            Console.WriteLine("出队之后,队列的大小为:"+queue.Count);
            int j = queue.Peek();
            Console.WriteLine("Peek之后,得到的结果为:"+j);
            Console.WriteLine("Peek之后队列的大小为:"+queue.Count);
            queue.Clear();
            Console.WriteLine("Clear之后,队列的大小:"+queue.Count);

        }
    }
}

打印结果

添加了23 25 67 89 之后队列的大小为:4
取得的数据为:23
出队之后,队列的大小为:3
Peek之后,得到的结果为:25
Peek之后队列的大小为:3
Clear之后,队列的大小:0

顺序队列

顺序队列是一种先进先出的线性表,使用数组存储数据,并用两个指针 front 和 rear 分别指示队头和队尾元素。C# 中没有直接提供顺序队列的实现,但可以使用 Queue 类来模拟顺序队列的操作。Queue 类提供了 Enqueue、Dequeue、Peek、Count 等方法和属性[1](https://www.runoob.com/csharp/csharp-queue.html)。您可以参考以下网址[2](https://blog.csdn.net/sigmarising/article/details/114625754)[3](https://blog.csdn.net/a962035/article/details/79796214)[4](https://www.cnblogs.com/itjeff/p/5439934.html)了解更多关于 C# 中的顺序队列的信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GyBRWRz-1680190908466)(null)]

图中最右边front应为3

自定义IQueue.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _03_Queue
{
    interface IQueue<T>
    {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Enqueue(T item);//入队
        T Dequeue();//出队
        T Peek();
    }
}

SeqQueue.cs(实现接口)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _03_Queue
{
    class SeqQueue<T> : IQueue<T>
    {
        //声明数组来储存数据
        private T[] data;
        //表示当前有多少元素
        private int count;
        //队首=队首元素索引-1
        private int front;
        //队尾=队尾元素索引
        private int rear;
        //初始化容量
        public SeqQueue(int size)
        {
            data = new T[size];
            count = 0;
            front = -1;
            rear = -1; 
        }
        //默认容量为10
        public SeqQueue():this(10)
        {

        }
        public int Count {
            get
            {
                return count;
            }
        }

        public void Clear()
        {
            count = 0;
            front = -1;
            rear = -1;
        }
        /// <summary>
        /// 出队
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (count>0)
            {
                //取得队首元素
                T temp = data[front + 1];
                front++;
                count--;
                return temp;
            }
            else
            {
                Console.WriteLine("队列为空,无法取得队首的数据");
                return default(T);
            }
        }
        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            //队内元素有没有满
            if (count==data.Length)
            {
                //
                Console.WriteLine("队列已满,不可以在添加新的数据");

            }
            else
            {
                //如果队尾为最后一个元素索引
                if (rear==data.Length-1)
                {
                    //将队尾添加到0号位
                    data[0] = item;
                    rear = 0;
                    count++;
                }
                else
                {
                    data[rear + 1] = item;
                    rear++;
                }
                count++;
            }
        }

        public int GetLength()
        {
            return count;
        }

        public bool IsEmpty()
        {
            return count == 0;
        }

        public T Peek()
        {
            T temp = data[front + 1];
            return temp;
        }
    }
}

介绍

在 C# 中,队列(Queue 类)是一种线性数据结构,它代表了一个先进先出的对象集合[1](http://c.biancheng.net/csharp/queue.html)。当您需要对项目进行先进先出访问时,则可以使用队列[2](https://www.runoob.com/csharp/csharp-queue.html)。队列的出口端叫作队头(front),队列的入口端叫作队尾(rear)[3](https://zhuanlan.zhihu.com/p/315212925)

当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队[2](https://www.runoob.com/csharp/csharp-queue.html)。队列接受 null 作为引用类型的有效值,并且可以根据需要自动增加容量[4](https://zhuanlan.zhihu.com/p/486127721)

C# 还提供了 ConcurrentQueue 类,它是一个高效的线程安全的队列,适用于多线程环境[5](https://blog.csdn.net/qq_41230604/article/details/126305068)

代码示例

using System;
using System.Collections.Generic;

namespace _03_QueueTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue<int> queue = new Queue<int>();
            //入队
            queue.Enqueue(23);//队首
            queue.Enqueue(25);
            queue.Enqueue(67);
            queue.Enqueue(89);
            Console.WriteLine("添加了23 25 67 89 之后队列的大小为:"+queue.Count);
            //出队(取得队首的数据,并删除)
            int i = queue.Dequeue();
            Console.WriteLine("取得的数据为:"+i);
            Console.WriteLine("出队之后,队列的大小为:"+queue.Count);
            int j = queue.Peek();
            Console.WriteLine("Peek之后,得到的结果为:"+j);
            Console.WriteLine("Peek之后队列的大小为:"+queue.Count);
            queue.Clear();
            Console.WriteLine("Clear之后,队列的大小:"+queue.Count);

        }
    }
}

打印结果

添加了23 25 67 89 之后队列的大小为:4
取得的数据为:23
出队之后,队列的大小为:3
Peek之后,得到的结果为:25
Peek之后队列的大小为:3
Clear之后,队列的大小:0

顺序队列

顺序队列是一种先进先出的线性表,使用数组存储数据,并用两个指针 front 和 rear 分别指示队头和队尾元素。C# 中没有直接提供顺序队列的实现,但可以使用 Queue 类来模拟顺序队列的操作。Queue 类提供了 Enqueue、Dequeue、Peek、Count 等方法和属性[1](https://www.runoob.com/csharp/csharp-queue.html)。您可以参考以下网址[2](https://blog.csdn.net/sigmarising/article/details/114625754)[3](https://blog.csdn.net/a962035/article/details/79796214)[4](https://www.cnblogs.com/itjeff/p/5439934.html)了解更多关于 C# 中的顺序队列的信息。

05 队列(C#实现)

图中最右边front应为3

自定义IQueue.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _03_Queue
{
    interface IQueue<T>
    {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Enqueue(T item);//入队
        T Dequeue();//出队
        T Peek();
    }
}

SeqQueue.cs(实现接口)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _03_Queue
{
    class SeqQueue<T> : IQueue<T>
    {
        //声明数组来储存数据
        private T[] data;
        //表示当前有多少元素
        private int count;
        //队首=队首元素索引-1
        private int front;
        //队尾=队尾元素索引
        private int rear;
        //初始化容量
        public SeqQueue(int size)
        {
            data = new T[size];
            count = 0;
            front = -1;
            rear = -1; 
        }
        //默认容量为10
        public SeqQueue():this(10)
        {

        }
        public int Count {
            get
            {
                return count;
            }
        }

        public void Clear()
        {
            count = 0;
            front = -1;
            rear = -1;
        }
        /// <summary>
        /// 出队
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (count>0)
            {
                //取得队首元素
                T temp = data[front + 1];
                front++;
                count--;
                return temp;
            }
            else
            {
                Console.WriteLine("队列为空,无法取得队首的数据");
                return default(T);
            }
        }
        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            //队内元素有没有满
            if (count==data.Length)
            {
                //
                Console.WriteLine("队列已满,不可以在添加新的数据");

            }
            else
            {
                //如果队尾为最后一个元素索引
                if (rear==data.Length-1)
                {
                    //将队尾添加到0号位
                    data[0] = item;
                    rear = 0;
                    count++;
                }
                else
                {
                    data[rear + 1] = item;
                    rear++;
                }
                count++;
            }
        }

        public int GetLength()
        {
            return count;
        }

        public bool IsEmpty()
        {
            return count == 0;
        }

        public T Peek()
        {
            T temp = data[front + 1];
            return temp;
        }
    }
}