标签:c#
理论基础:
栈(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/
本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1659997
标签:c#
原文地址:http://57388.blog.51cto.com/47388/1659997