12. C#数据结构与算法 -- 顺序栈

理论基础:

      栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。

faIr6fF.png


      栈可以分为顺序栈和链栈。

      用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(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/ 

 

你可能感兴趣的:(C#)