19.2.5 Stack和Stack<T>

Stack,称为栈,栈和队列非常相似,只不过队列中的数据是先入先出,而栈中的数据添加和移除只在列表的一端进行,遵守栈中的数据则后进先出(Last In First Out,LIFO)原则。Stack类实现了ICollection和IEnumerable接口,类图如图19-14所示。

19.2.5 Stack和Stack<T> - 图1

图 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.2.5 Stack和Stack<T> - 图2

代码清单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.2.5 Stack和Stack<T> - 图3

图 19-15 代码清单19-5的示意图