Blink

纸上得来终觉浅,绝知此事要躬行

数据结构:栈

栈的定义

栈(Stack)是限定仅在表尾进行插入和删除的线性表。允许插入和删除的一端称为栈顶(Top),另一端成为栈底(Bottom),不含任何数据元素的栈称为空栈。栈又成为后进先出的(Last In First Out)的线性表,简称LIFO结构。

  • 栈的插入操作叫做进栈,也称压栈,入栈
  • 栈的删除操作叫做出栈,也称弹栈

《数据结构:栈》

我们可以将栈结构想象为手枪弹夹,当我们给弹夹上子弹的时候,最先压入弹夹的子弹会在弹夹的最底部,最后压入弹夹的子弹会在最上面,当开枪发射子弹时,最后上的子弹(也就是最上面的子弹)会最先发射出去。

代码实现

  • 定义栈节点类
    public class StackNode<T>
    {
        public StackNode<T> next;   // 下一个节点的引用
        public T value;             // 存储的数据
        public StackNode(T value){
            this.value = value;
        }
    }
  • 栈的具体实现
public class MyStack<T>
    {
        private StackNode<T> m_Top = null;  // 栈顶节点引用
        private int m_Count = 0;            // 记录栈中元素个数

        public MyStack()
        {
        }

        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="value"></param>
        public void Push(T value){
            if(m_Top == null){
                m_Top = new StackNode<T>(value);
            }else{
                StackNode<T> node = new StackNode<T>(value);
                node.next = m_Top;
                m_Top = node;
            }
            m_Count++;
        }

        /// <summary>
        /// 出栈
        /// </summary>
        /// <returns></returns>
        public T Pop(){
            if(m_Top == null) return default(T);
            StackNode<T> node = m_Top;
            m_Top = m_Top.next;
            m_Count--;
            return node.value;
        }

        /// <summary>
        /// 获取栈顶元素
        /// </summary>
        /// <returns></returns>
        public T Peek(){
            if(m_Top == null) return default(T);
            return m_Top.value;
        }

        /// <summary>
        /// 栈中元素个数
        /// </summary>
        /// <returns></returns>
        public int Count(){
            return m_Count;
        }

        /// <summary>
        /// 是否为空栈
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty(){
            return m_Top == null;
        }

        /// <summary>
        /// 清空栈
        /// </summary>
        public void Clear(){
            m_Top = null;
            m_Count = 0;
        }
    }

测试

        public static void Main(string[] args)
        {
            MyStack<int> stack = new MyStack<int>();
            stack.Push(100);
            stack.Push(200);
            //stack.Clear();
            Console.WriteLine(stack.Peek());
            stack.Pop();
            Console.WriteLine(stack.Peek());
            Console.WriteLine(stack.Count());
            Console.ReadKey(true);
        }

《数据结构:栈》

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注