zoukankan      html  css  js  c++  java
  • 数据结构之栈

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

    数组栈  

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

    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

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

  • 相关阅读:
    为什么前后端分离了,你比从前更痛苦?
    HTML命名规范
    常用一屏自适应布局(一)
    CSS-网站导航栏标题之间的分隔符
    React-setState源码的理解
    如何在React-Native上使用Typescript
    immutable-js基础
    stylus 移动端边框1像素问题解决方案
    react native ts环境搭建
    react结合ts与mobx环境搭建步骤详解
  • 原文地址:https://www.cnblogs.com/anjingdian/p/15173210.html
Copyright © 2011-2022 走看看