一、Stack
堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。
Stack 类的方法和属性
Stack 类的一些常用的 属性:
属性 | 描述 |
---|---|
Count | 获取 Stack 中包含的元素个数。 |
Stack 类的一些常用的 方法:
方法 | 描述 |
---|---|
public virtual void Clear(); | 从 Stack 中移除所有的元素。 |
public virtual bool Contains( object obj ); | 判断某个元素是否在 Stack 中。 |
public virtual object Peek(); | 返回在 Stack 的顶部的对象,但不移除它。 |
public virtual object Pop(); | 移除并返回在 Stack 的顶部的对象。 |
public virtual void Push( object obj ); | 向 Stack 的顶部添加一个对象。 |
public virtual object[] ToArray(); | 复制 Stack 到一个新的数组中。 |
实例
using System;using System.Collections;namespace CollectionsApplication{class Program{static void Main(string[] args){Stack st = new Stack();st.Push(\'A\');st.Push(\'M\');st.Push(\'G\');st.Push(\'W\');Console.WriteLine(\"Current stack: \");foreach (char c in st){Console.Write(c + \" \");}Console.WriteLine();st.Push(\'V\');st.Push(\'H\');Console.WriteLine(\"The next poppable value in stack: {0}\",st.Peek());Console.WriteLine(\"Current stack: \");foreach (char c in st){Console.Write(c + \" \");}Console.WriteLine();Console.WriteLine(\"Removing values :{0}\", st.Pop());Console.WriteLine(\"Removing values :{0}\", st.Pop());Console.WriteLine(\"Removing values :{0}\", st.Pop());Console.WriteLine(\"Current stack: \");foreach (char c in st){Console.Write(c + \" \");}}}}
结果
Current stack:W G M AThe next poppable value in stack: HCurrent stack:H V W G M ARemoving values :HRemoving values :VRemoving values :WCurrent stack:G M A
二、ConcurrentStack
由于Stack是线程不安全的集合,在进行多线程多任务操作集合时会出现数据丢失等问题。通常的解决方法是添加lock锁。lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。但锁的引入,带来了一定的开销和性能的损耗,并降低了程序的扩展性,而且还会有死锁的可能。
在.NET Framework 4提供了新的线程安全和扩展的并发集合,它们能够解决潜在的死锁问题和竞争条件问题,因此在很多复杂的情形下它们能够使得并行代码更容易编写,这些集合尽可能减少使用锁的次数,从而使得在大部分情形下能够优化为最佳性能,不会产生不必要的同步开销。(需要注意:在串行代码中不要使用并发集合,会增加不必要的开销)
Stack对应的线程安全的并发集合就是 ConcurrentStack,命名空间:System.Collections.Concurrent。
ConcurrentStack类的常用方法:
方法 | 描述 |
---|---|
public void Push(Object obj) | 向 ConcurrentStack的顶部添加一个对象。 |
public bool TryPop() | 移除并返回在 ConcurrentStack的顶部的对象。 |
关于ConcurrentStack是如何实现线程安全的,可参考文章C# ConcurrentStack实现