并不是所有的集合被平等地创建。大部分情况下,有序的集合用对象列表处理比单独地访问它们是很明智的。
什么是有序列表?
通常集合是简单的一系列的对象集合,这些对象集合以一种有序地方式处理。例如,你可能创建一个类,依赖于特定的需求,你可能需要去访问对象时,一次只访问集合内的一个集合项。而且访问列表中间的项对于这个类没什么用。代替使用集合如ArrayList ,.NET Framework 有两个类它们的工作是像一个列表一样去存数据并且简单地按它们需要的去访问这些对象。Queue类和Stack类目的是被用于在一个有序的基础上存数据。
Queue 类
Queue 类是处理先进先出的有序的对象集。Queue 类的接口非常简单:它支持把数据入列和出列。队列的功能与ArrayList。特别地,访问和删除集合项在ArrayList 中是两个不同的操作。Queue 把这两个操作结合到了Dequeue 方法中。因为Queue类目的是被用来创建对象列表用来用某种方式来工作。像这个名称一样,队列像在银行排队的客户。它仅仅在意谁是下一个和在队列尾部加人。Queue类中最重要的属性和方法如下:
Name Description
Count 得到队列内的数据项的数目
Name Description
Dequeue 从队列头获取集合项,同时删除它。
Enqueue 从对尾添加数据项。
Peek 获取第一个集合项但不删除它
一旦你有了一个这个类的实例,你就能使用Enqueue 方法去向队列中增加数据项并用方法从列表中删除数据项,如:
Queue q = new Queue();
q.Enqueue("An item");
Console.WriteLine(q.Dequeue());
Queue 类允许你去增加重复的项和null值,所以你不能通过Dequeue和Peek方法去验证队列是否为空。为了验证是否为空,你要用Count 属性去看集合是否为空。如: 如果你要向队列中添加数据项并要删除它们然后把它们显示出来,如:
// C#
Queue q = new Queue();
q.Enqueue("First");
q.Enqueue("Second");
q.Enqueue("Third");
q.Enqueue("Fourth");
while (q.Count > 0)
{
Console.WriteLine(q.Dequeue());
}
因为Queue是个先入先出的集合,以上的例子将会出现以下的结果:
First
Second
Third
Fourth
你能够看下一个集合项同时不删除它,这种情况是很多的。假设你的代码操作对象的某些类型,如果你让它出队,然后发现某些人还要使用它,你就要把它放回队列中,但是它会丢掉队中的位置。这时Peek方法来了,如:
if (q.Peek() is String)
{
Console.WriteLine(q.Dequeue());
}
有些时候,你需要的是后进先出,这时Stack 类出现了。
Stack 类
与Queue 类相反, Stack 类是一个后进先出的集合。Stack类的接口非常简单:它提供了入栈和出栈操作。像它的名字一样,Stack类可以比作卡片栈。当你加入卡片到栈,你能从顶端拿走一张卡片,但不能从栈的中间拿卡片。方法和属性如下:
属性:
Name Description
Count 得到栈内集合项的数目
方法:
Name Description
Pop 从栈顶获取集合项同时删除它。
Push 向从栈顶添加集合项。
Peek 从栈顶获取集合项不删除它。
对Stack 类的操作与Queue 类类似, 如:
Stack s = new Stack();
s.Push("An item");
Console.WriteLine(s.Pop());
对于Queue 类, 你能添加重复数据和空值,所以你不能用Pop 或 Peek 方法去看Stack 为空。如:如果你向Stack 中添加集合项并且去删除它们。如下代码:
// C#
Stack s = new Stack();
s.Push("First");
s.Push("Second");
s.Push("Third");
s.Push("Fourth");
while (s.Count > 0)
{
Console.WriteLine(s.Pop());
}
因为Stack是一个后进先出的集合,结果会反转:
Fourth
Third
Second
First