介绍
在 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# 中的顺序队列的信息。
图中最右边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;
}
}
}