来源:互联网 发布:飞利浦音响知乎 编辑:程序博客网 时间:2024/06/05 10:06
1,什么是栈
首先栈是一种特殊的线性表。那它的特殊性表现在哪里呢?栈是限定在表的一端进行插入和删除运算的线性表,因此,栈也称为后进先出(LIFO)的线性表。
它有很多应用场景,比如食堂中的一叠盘子,我们只能从顶端一个一个地取。

2,栈的存储结构


/// <summary>    /// 封装顺序栈    /// </summary>    /// <typeparam name="T"></typeparam>    public class SeqStack<T>    {        //使用数组来存放结点        public T[] data;        //栈顶指针        public int top = -1;        public SeqStack(int length)        {             data=new T[length];        }    }
3,栈的常见操作及实现代码
1,初始化
实现思路:用指定大小的length实例化一个SeqStack<T>,然后使top指针指向-1。
2,进栈
实现思路:将top指针加1,然后将新结点插入到top指针指向的位置。
3,出栈
实现思路:消灭top指向的结点,并使top指针减1。
4,获取栈顶元素
实现思路:与出栈相似,只是不改变栈的状态而已。
5,判断是否栈空
实现思路:如果top指针是否等于-1,如果是则返为空栈。
6,判断是否栈满
实现思路:检查top指针的值是否等于数组的长度,如果是则为栈满。

namespace DS.BLL{    public class SeqStackBLL    {        /// <summary>        /// 初始化        /// </summary>        /// <param name="length"></param>        /// <returns></returns>        public static SeqStack<T> Init<T>(int length)        {            SeqStack<T> seqStack = new SeqStack<T>(length);            seqStack.top = -1;            return seqStack;        }        /// <summary>        /// 进栈        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqStack"></param>        /// <param name="data"></param>        public static void Push<T>(SeqStack<T> seqStack, T data)        {             //检查是否栈满            if (IsFull(seqStack)) return;            seqStack.data[++seqStack.top] = data;        }        /// <summary>        /// 出栈        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqStack"></param>        public static T Pop<T>(SeqStack<T> seqStack)        {             //检查是否栈空            if (IsEmpty(seqStack)) return default(T);            seqStack.data[seqStack.top]=default(T);            return seqStack.data[--seqStack.top];        }        /// <summary>        /// 获取栈顶元素        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqStack"></param>        /// <returns></returns>        public static T GetTop<T>(SeqStack<T> seqStack)        {            //检查是否栈空            if (IsEmpty(seqStack)) return default(T);            return seqStack.data[seqStack.top];        }        /// <summary>        /// 获取栈中元素个数        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqStack"></param>        /// <returns></returns>        public static int GetLength<T>(SeqStack<T> seqStack)        {            return seqStack.top + 1;        }        /// <summary>        /// 判断是否栈满        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqStack"></param>        /// <returns></returns>        private static bool IsFull<T>(SeqStack<T> seqStack)        {            return seqStack.top == seqStack.data.Length;        }        /// <summary>        /// 判断是否栈空        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqStack"></param>        /// <returns></returns>        private static bool IsEmpty<T>(SeqStack<T> seqStack)        {            return seqStack.top == -1;        }    }    /// <summary>    /// 封装顺序栈    /// </summary>    /// <typeparam name="T"></typeparam>    public class SeqStack<T>    {        //使用数组来存放结点        public T[] data;        //栈顶指针        public int top = -1;        public SeqStack(int length)        {             data=new T[length];        }    }}

0 0
原创粉丝点击