栈
前言:栈是与队列非常类似的另一个容器。只是要使用不同的方法访问栈。最后添加到栈中的元素会最先读取。栈是一个后进先出(LIFO)的容器。
如下图表示一个栈,用Push()方法在栈中添加元素,用Pop()方法获取最近添加的元素。
与Queue<T>类相同,Stack<T>类实现了IEnumberable和ICollection接口。下图表示栈集合中一些常用的属性和方法:
在下面的例子中,使用Push()方法把三个元素添加到栈中。在foreach方法中,使用IEnumberable接口迭代所有的元素。栈的枚举器不会删除元素。它只会逐个返回元素。
static void Main(string[] args) { var alphabets = new Stack<char>(); //压栈 alphabets.Push('a'); alphabets.Push('b'); alphabets.Push('c'); //迭代所有的元素 foreach (var alphabet in alphabets) { Console.WriteLine(alphabet); } Console.ReadKey(); }
因为元素的读取顺序时从最后一个添加到栈中的元素开始到第一个元素,所以的到如下的结果:
用枚举器读取元素不会改变元素的状态。使用Pop()方法会从栈中读取每个元素,并且删除它们。这样就可以使用while循环迭代集合,检查Count()属性。确定栈中是否还有元素。
static void Main(string[] args) { var alphabets = new Stack<char>(); //压栈 alphabets.Push('a'); alphabets.Push('b'); alphabets.Push('c'); //迭代所有的元素 foreach (var alphabet in alphabets) { Console.WriteLine(alphabet); } Console.WriteLine("第二次输出"); while (alphabets.Count > 0) { Console.WriteLine(alphabets.Pop()); } Console.ReadKey(); }
结果是两次cba,每次迭代对应一个cba,在第二次之后,栈会变空,因为第二次迭代使用了Pop()方法。
查询栈顶元素Peek()方法:
char res = alphabets.Peek(); //c
确定某元素是否在Stack<T>中使用Contains()方法:
bool result = alphabets.Contains('a'); //true