19.2.3 Queue和Queue<T>
Queue,称为队列,队列是这样一种数据结构:数据由列表的一端插入,并由列表的另一端移除。就像单行道,只能从一端进,从另一端出。队列中的数据遵循先进先出的行为准则,因此队列特适合按接收顺序存储消息,并按顺序进行处理。队列在我们的生活中也十分常见。例如:在电影院排队购票,排在队首的先购票,后来的站在队尾等待,队首的人买了票就离开了这个“队列”,他身后的人顶上成为新的队首。如此往复,直到所有的人都买到了票。图19-9演示了队列的这种行为。
图 19-9 队列的FIFO行为示意图
Queue的一些重要特性如下:
❑先进先出(First In First Out);
❑可以添加null值到集合中;
❑允许集合中的元素重复;
❑Queue的容量会按需自动增加;
❑Queue的等比因子是当需要更大容量时当前容量要乘以的数字,默认为2.0。
Queue类实现了ICollection和IEnumerable接口,如图19-10所示。它还有泛型版本,我们会在稍后介绍。
图 19-10 Queue的类图
Queue有4个公共构造函数,如下:
❑Queue():创建一个空的Queue实例,容量默认初始化为32,增长因子默认初始化为2.0;
❑Queue(ICollection col):从指定集合复制的元素,具有与所复制的元素数相同的初始容量,如果要复制的集合元素数为0,则把队列容量默认初始化为32,并使用默认增长因子2.0;
❑Queue(int capacity):创建一个空的Queue实例,使用指定的初始容量初始化队列实例,并使用默认增长因子2.0;
❑Queue(int capacity,float growFactor):创建一个空的Queue实例,使用指定的容量值和增长因子值初始化队列实例。
Queue的一些主要成员如表19-4所示。
代码清单19-3 演示了队列的常用操作。
代码清单19-3 Queue实例代码
using System;
using System.Collections;
namespace ProgrammingCSharp4
{
class CollectionSample
{
public static void Main()
{
Queue myQ=new Queue();
myQ.Enqueue("A");
myQ.Enqueue("B");
myQ.Enqueue("C");
myQ.Enqueue("D");
ShowQueueInfo(myQ);
Console.WriteLine("-".PadLeft(50,'-'));
DequeueValues(myQ);
Console.WriteLine("-".PadLeft(50,'-'));
ShowQueueInfo(myQ);
}
private static void ShowQueueInfo(Queue myQ)
{
Console.Write(“myQ队列元素数:{0}”,myQ.Count);
Console.Write("\t");
PrintValues(myQ);
}
private static void DequeueValues(Queue myQ)
{
int count=myQ.Count;
for(int i=0;i<count;i++)
{
string item=myQ.Dequeue()as string;
Console.Write(“\t出队:{0}\t”,item);
PrintValues(myQ);
}
}
public static void PrintValues(IEnumerable myCollection)
{
Console.Write(“队列:”);
foreach(Object obj in myCollection)
Console.Write("{0}",obj);
Console.WriteLine();
}
}
}
上述代码的运行结果为:
图19-11演示了上述代码的行为。
图 19-11 关于代码清单19-3的示意图