栈的用途比较广 ,如:子进程调用,递归调用,表达式转换,二叉树遍历,深度优先搜索 等等。
使用泛型栈之前需要命名空间System.Collections.Generic
使用泛型可以减少装箱拆箱,而且若泛型类型为object,则泛型栈队列可以完全取代普通栈队列。
Stack<int> _s = new Stack<int>(); Queue<object> _q = new Queue<object>();
在其内部方法与使用上,与Stack和Queue一样。
举个例子:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Threading; namespace HelloWorld { class MyStack<T> { T[] StackArray; int StackPointer = 0; public void Push(T x) { if (!IsStackFull)//如果不满栈 { StackArray[StackPointer++] = x; } } public T Pop() { return (!IsStackEmpty)//如果不是空栈,pop;如果是空栈,返回栈底 ? StackArray[--StackPointer] : StackArray[0]; } const int MaxStack = 10; bool IsStackFull { get { return StackPointer >= MaxStack; } }//判断是否满栈,满栈返回true bool IsStackEmpty { get{ return StackPointer<=0;}}//判断是否空栈,空栈返回true public MyStack() { StackArray=new T[MaxStack]; } public void Print() { for (int i = StackPointer - 1; i >= 0; i--) { Console.WriteLine("Value: {0}",StackArray[i]); } } } class Program { static void Main(string[] args) { var stackInt = new MyStack<int>(); var stackString = new MyStack<string>(); stackInt.Push(3); stackInt.Push(5); stackInt.Push(7); stackInt.Print(); stackString.Push("Generics are great!"); stackString.Push("Hi there!"); stackString.Print(); } } }
队列是其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collections.Generic命名空间中的泛型类Queue实现。
队列的成员
Count:Count属性返回队列中元素个数。
Enqueue:Enqueue()方法在队列一端添加一个元素。
Dequeue:Dequeue()方法在队列的头部读取和删除元素。如果在调用Dequeue()方法时,队列中不再有元素,就抛出一个InvalidOperationException类型的异常。
Peek:Peek()方法从队列的头部读取一个元素,但不删除它。
TrimExcess:TrimExcess()方法重新设置队列的容量。Dequeue()方法从队列中删除元素,但它不会重新设置队列的容量。要从队列的头部去除空元素,应使用TrimExcess()方法。
Clear:Clear()方法从队列中移除所有的元素。
ToArray:ToArray()复制队列到一个新的数组中。