19.2.5 Stack和Stack<T>
Stack,称为栈,栈和队列非常相似,只不过队列中的数据是先入先出,而栈中的数据添加和移除只在列表的一端进行,遵守栈中的数据则后进先出(Last In First Out,LIFO)原则。Stack类实现了ICollection和IEnumerable接口,类图如图19-14所示。
图 19-14 Stack的类图
Stack类的一些重要特性如下:
❑后进先出;
❑可以添加null值到集合中;
❑允许集合中的元素重复;
❑Stack的容量会按需自动增加。
Stack类共有3个公共构造函数,如下:
❑public Stack():创建一个空的Stack实例,容量默认初始化为10;
❑public Stack(ICollection col):从指定集合复制的元素,具有与所复制的元素数相同的初始容量,如果要复制的集合元素数为0,则把队列容量默认初始化为32;
❑public Stack(int initialCapacity):使用指定的容量创建一个空的Stack实例,如果指定的容量值小于默认初始容量10,则使用10作为初始容量。
同样,我们先介绍下Stack类的一些主要成员,如表19-5所示。
代码清单19-5 演示了栈的常用操作。
代码清单19-5 Stack示例代码
using System;
using System.Collections;
namespace ProgrammingCSharp4
{
class CollectionSample
{
public static void Main()
{
Stack myStack=new Stack();
Console.WriteLine(“入栈”);
Console.WriteLine("-".PadLeft(50,'-'));
myStack.Push("A");
ShowStackInfo(myStack);
myStack.Push("B");
ShowStackInfo(myStack);
myStack.Push("C");
ShowStackInfo(myStack);
myStack.Push("D");
ShowStackInfo(myStack);
Console.WriteLine(“出栈”);
Console.WriteLine("-".PadLeft(50,'-'));
PopValues(myStack);
}
private static void PopValues(Stack stack)
{
int count=stack.Count;
for(int i=0;i<count;i++)
{
stack.Pop();
ShowStackInfo(stack);
}
}
private static void ShowStackInfo(Stack stack)
{
Console.WriteLine("myStack");
Console.WriteLine("\tCount:\t{0}",stack.Count);
Console.Write("\tValues:");
PrintValues(stack);
}
public static void PrintValues(IEnumerable myCollection)
{
foreach(Object obj in myCollection)
Console.Write("\t{0}",obj);
Console.WriteLine();
}
}
}
上述代码的运行结果为:
入栈
myStack
Count:1
Values:A
myStack
Count:2
Values:B A
myStack
Count:3
Values:C B A
myStack
Count:4
Values:D C B A
出栈
myStack
Count:3
Values:C B A
myStack
Count:2
Values:B A
myStack
Count:1
Values:A
myStack
Count:0
Values:
请按任意键继续……
图19-15演示了上述代码的行为。
图 19-15 代码清单19-5的示意图