数据结构之栈

栈:是一种先进后出的线性表,只能在栈顶(表尾)进行插入删除操作。

数组栈  

通过下面代码可以看出来,栈只是用了动态数组的其中几个方法,只能在尾部进行添加删除操作,是功能受限一种数组结构。所以只能在栈顶进栈顶出。

 

namespace DataStructure
{ 
   /// <summary>
    /// 定义一个栈接口, 
    /// </summary>
    /// <typeparam name="E"></typeparam>
    interface IStack<E>
    {
        int Count { get; }
        bool IsEmpty { get; }
        void Push(E e);
        E Pop();
        E Peek(); 
    }

    /// <summary>
    /// 数组栈
    /// </summary>
    /// <typeparam name="E"></typeparam>
    class ArrayIStack<E> : IStack<E>
    {
        //存入的一个数组
        private MyArray<E> arr;
        /// <summary>
        /// 创建指定长度的数组
        /// </summary>
        /// <param name="capacity"></param>
        public ArrayIStack(int capacity)
        {
            arr = new MyArray<E>(capacity);
        }
        /// <summary>
        /// 创建默认长度的数组
        /// </summary>
        ///  
        public ArrayIStack()
        {
            arr = new MyArray<E>();
        }

        public int Count
        {
            get { return arr.Count; }
        }

        public bool IsEmpty
        {
            get { return arr.IsNull; }
        }

        /// <summary>
        /// 获取尾部的元素
        /// </summary>
        /// <returns></returns>
        public E Peek()
        {
            return arr.GetLast();
        }

        public E Pop()
        {
          return  arr.RemoveLast();
        }
        /// <summary>
        /// 添加元素:因为数组只有在尾部添加元素,耗费时间最少
        /// 所以将元素从尾部添加
        /// </summary>
        /// <param name="e"></param>
        public void Push(E e)
        {
            arr.AddLast(e);
        }
 
    }
}

 

 

 

链表栈

   #region 链表栈

    class LinkedListIStack<E> : IStack<E>
    {
        /// <summary>
        /// 当前链表
        /// </summary>
        private MyLinkedList<E> list;
        public LinkedListIStack()
        {
            list = new MyLinkedList<E>();
        }

        public int Count
        {
            get { return list.Count; }
        }

        public bool IsEmpty
        {
            get
            {
                return list.IsEmpty;
            }

        }
        /// <summary>
        /// 获取栈顶元素()
        /// 和数组不同的是,单链表获取表头元素时最快,所以这里使用链表中获取头部元素的方法
        /// </summary>
        /// <returns></returns>
        public E Peek()
        {
            return list.GetFirst();
        }
        /// <summary>
        /// 出栈操作
        /// </summary>
        /// <returns></returns>
        public E Pop()
        {
            return list.RemoveFirst();
        }

        public void Push(E e)
        {
            list.AddFirst(e);
        }
    }

    #endregion

 从上面的代码我们可以分析出,不管是数组栈还是链表栈,这几个方法都是最优的。

 

posted @ 2021-08-22 19:10  安静点--  阅读(48)  评论(0编辑  收藏  举报