9.4 Stack堆栈类
堆栈是一种后进先出(LIFO)的数据结构。回顾Queue队列类中的货物管理的例子,队列类将先入仓的货物后出仓,但假如有一些实时性非常强的货物,需要后入仓先出仓,示意如图9.11所示,则很容易发现与图9.9的区别。

图9.11 后进先出的图示
9.4.1 创建堆栈
为了创建Stack类的实例,需要调用Stack类提供的构造函数。Statck类的构造函数提供了三种重载形式,声明代码如下所示。
//使用默认的初始容量创建Stack类的新实例
public Stack();
//使用从ICollection集合复制的元素来创建Stack类的实例,并具有与集合元素数目相同的初始容量
public Stack(ICollection col);
//通过指定初始容量来创建Stack类的实例
public Stack(int initialCapacity);
下面的代码示范这三种构造函数的使用方法。
//使用默认容量
Stack sack = new Stack();
//使用由string数组中的集合元素初始化堆栈对象
Stack sack1 = new Stack(new string[5] { "堆栈元素一", "堆栈元素二", "堆栈元素三", "堆栈元素四", "堆栈元素五" });
//创建堆栈对象并指定20个元素
Stack sack2 = new Stack(20);
9.4.2 元素入栈
为了将元素压入堆栈,可以调用Stack类的Push方法,这个方法的声明如下。
public virtual void Push(object obj)
这个方法需要一个object类型的参数obj,表示要被压入到堆中的对象。下面的代码例示了压入栈的操作。
static void Main(string[] args)
{
//声明并实例化一个新的Stack类
Stack sk = new Stack();
//调用Push方法压入堆栈
sk.Push("堆栈元素一");
sk.Push("堆栈元素二");
sk.Push("堆栈元素三");
sk.Push("堆栈元素四");
//在控制台窗口中显示堆栈内容
DisplayResult(sk);
Console.ReadLine();
}
//在控制台窗口中显示堆栈内容
static void DisplayResult(Stack sk)
{
foreach (object s in sk)
{
Console.WriteLine(s);
}
}
代码示例的结果如图9.12所示。

图9.12 压入栈的例示结果
通过图9.12,可以看到元素的排列顺序是后入栈的排列在最前,符合LIFO的规则。
9.4.3 元素出栈
元素出栈是指:移除Stack顶部的元素,并返回这个元素的引用。可以通过调用Pop方法实现元素出栈。另外Stack还提供了Peek方法,用于获取顶部元素对象,这个方法并不移除顶部元素。这两个方法的声明如下所示。
public virtual object Peek();
public virtual object Pop();
下面将通过示例代码来演示元素出栈的操作。
static void Main(string[] args)
{
Stack sk = new Stack();
sk.Push("堆栈元素一");
sk.Push("堆栈元素二");
sk.Push("堆栈元素三");
sk.Push("堆栈元素四");
//在控制台窗口中显示堆栈内容
DisplayResult(sk);
Console.WriteLine("堆栈顶部的元素是:");
Console.WriteLine(sk.Peek());
Console.WriteLine("移除顶部的元素:{0}", sk.Pop());
Console.WriteLine("当前的堆栈中的元素是:");
DisplayResult(sk);
Console.ReadLine();
}
//在控制台窗口中显示堆栈内容
static void DisplayResult(Stack sk)
{
foreach (object s in sk)
{
Console.WriteLine(s);
}
}
示例代码的执行结果如图9.13所示。

图9.13 出栈的结果示例





