理论基础:
栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。
栈可以分为顺序栈和链栈。
用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(Sequence Stack)。类似于顺序表,用一维数组来存放顺序栈中的数据元素。栈顶指示器top设在数组下标为0的端,top随着插入和删除而变化,当栈为空时,top=-1。
链栈通常用单链表来表示,它的实现是单链表的简化。所以,链栈结点的结构与单链表结点的结构一样。由于链栈的操作只是在一端进行,为了操作方便,把栈顶设在链表的头部,并且不需要头结点。
C#中的栈:
C#2.0以下版本只提供了非泛型的Stack类,该类继承了ICollection、IEnumerable和ICloneable接口。
C#2.0提供了泛型的Stack<T>类,该类继承了IEnumerable<T>、ICollection和IEnumerable接口,关于泛型Stack<T>类的更具体的信息,读者可参考.NET Framework的有关书籍。
c#本身已经写好 了栈和队列,我们可以直接用,这里自己实现以下,就是为了更深刻的理解。
栈通常记为:S=
(a1,a2,…,an),S是英文单词stack的第1个字母。栈中元素按a1,a2,a3,...,an的次序进栈,出栈的次序为栈顶元素。即出栈的次序与进栈相反,an第一个出栈,a1最后一个出栈。所以,栈的操作是按照后进先出(Last
In First Out,简称LIFO)或先进后出(First In Last
Out,简称FILO)的原则进行的,因此,栈又称为LIFO表或FILO表。
对于栈来说,主要的操作有:
1、构造空栈
2、清空栈:ClearStack()
3、求栈长(获得栈中元素的个数):StackLength()
4、返回栈顶元素:GetTop()
5、压栈操作:Push(object e)
6、弹栈操作(出栈操作):Pop()
7、判断栈是否为空:IsEmpty()
8、判断栈是否已满:IsFull()
实例:
using System; class Stack { int maxsize; //顺序栈的容量 object[] data; //数组,用于存储栈中的数据 int top; //指示栈顶 public object this[int index] { get{return data[index];} set{ data[index] = value;} } //栈容量属性 public int Maxsize { get { return maxsize; } set { maxsize = value; } } //获得栈顶的属性 public int Top { get { return top; } } //使用构造器初始化栈 public Stack(int size) { data = new object[size]; maxsize = size; top = -1; } //求栈的长度(栈中的元素个数) public int StackLength() { return top+1; } //清空顺序栈 public void ClearStack() { top = -1; } //判断顺序栈是否为空 public bool IsEmpty() { if (top == -1) { return true; } else { return false; } } //判断顺序栈是否为满 public bool IsFull() { if (top == maxsize-1) { return true; } else { return false; } } //入栈操作 public void Push(object e) { if(IsFull()) { Console.WriteLine("栈已满!"); return; } data[++top] = e; } //出栈操作,并返回出栈的元素 public object Pop() { object temp = null; if (IsEmpty()) { Console.WriteLine("栈为空!"); return temp; } temp = data[top]; top --; return temp; } //获取栈顶数据元素 public object GetTop() { if (IsEmpty()) { Console.WriteLine("栈为空!"); return null; } return data[top]; } } //定义测试类 class Test { static void Main() { Stack s = new Stack(10); Random r = new Random(); //随机生成数据 int mid; for(int i = 0;i<10;i++) { mid = (int)r.Next(10,100); //获取10~100之间的整型数据 s.Push(mid); //将数据压栈 Console.WriteLine("将数据{0}压栈,现在栈中元素数为:{1}", mid,s.StackLength()); } Console.WriteLine("\n准备将数据元素888压栈:"); s.Push(888); Console.WriteLine("栈中元素个数为:{0}",s.StackLength()); Console.WriteLine(); for(int j = 0;j<10;j++)//循环出栈 { Console.WriteLine("将数据{0}弹栈,现在栈中元素数为:{1}", s.Pop(),s.StackLength()); } } }
实例2: 下面的实例演示了堆栈(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 "); st.Pop(); st.Pop(); st.Pop(); Console.WriteLine("Current stack: "); foreach (char c in st) { Console.Write(c + " "); } Console.ReadLine(); } } } ////当上面的代码被编译和执行时,它会产生下列结果: //Current stack: //W G M A //The next poppable value in stack: H //Current stack: //H V W G M A //Removing values //Current stack: //G M A
参考:
http://www.cnblogs.com/Richet/archive/2008/10/16/1313045.html
http://www.w3cschool.cc/csharp/csharp-stack.html
http://blog.163.com/fujl_2008/blog/static/10378107200810972618942/