19.2.3 Queue和Queue<T>

Queue,称为队列,队列是这样一种数据结构:数据由列表的一端插入,并由列表的另一端移除。就像单行道,只能从一端进,从另一端出。队列中的数据遵循先进先出的行为准则,因此队列特适合按接收顺序存储消息,并按顺序进行处理。队列在我们的生活中也十分常见。例如:在电影院排队购票,排在队首的先购票,后来的站在队尾等待,队首的人买了票就离开了这个“队列”,他身后的人顶上成为新的队首。如此往复,直到所有的人都买到了票。图19-9演示了队列的这种行为。

19.2.3 Queue和Queue<T> - 图1

图 19-9 队列的FIFO行为示意图

Queue的一些重要特性如下:

❑先进先出(First In First Out);

❑可以添加null值到集合中;

❑允许集合中的元素重复;

❑Queue的容量会按需自动增加;

❑Queue的等比因子是当需要更大容量时当前容量要乘以的数字,默认为2.0。

Queue类实现了ICollection和IEnumerable接口,如图19-10所示。它还有泛型版本,我们会在稍后介绍。

19.2.3 Queue和Queue<T> - 图2

图 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.2.3 Queue和Queue<T> - 图3

代码清单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.2.3 Queue和Queue<T> - 图4

图19-11演示了上述代码的行为。

19.2.3 Queue和Queue<T> - 图5

图 19-11 关于代码清单19-3的示意图