zoukankan      html  css  js  c++  java
  • C#数据结构-栈

    栈的定义不需要多说,相信大家都非常熟悉,但是,在实际应用中栈的应用我们很少想到会去用栈结构,先上代码看下用法:

     Stack st = new Stack();
      st.Push('A');
      st.Push('B');
      st.Push('C');
      st.Push('D');
      foreach (char c in st)
      {
          Console.Write(c + " ");
      }
      Console.WriteLine();
      st.Push('E');
      foreach (char c in st)
      {
          Console.Write(c + " ");
      }
      Console.WriteLine();
      st.Pop();
      st.Pop();
      st.Pop();
      foreach (char c in st)
      {
          Console.Write(c + " ");
      }
      Console.ReadLine();

     现在我们自己实现一个栈结构:

      /// <summary>
        ////// </summary>
        public class MyStack
        {
            /// <summary>
            /// 栈的实现还是使用数组的方式存储
            /// </summary>
            public Object[] content { get; set; }
            /// <summary>
            /// 栈深度
            /// </summary>
            public int size { get; set; }
            /// <summary>
            /// 默认开始深度
            /// </summary>
            public int defaultSize { get; set; } = 10;
            /// <summary>
            /// 初始化 默认深度
            /// </summary>
            public MyStack()
            {
                content = new object[defaultSize];
                size = 0;
            }
            /// <summary>
            /// 压栈
            /// </summary>
            /// <param name="obj"></param>
            public virtual void Push(Object obj)
            {
                //如果数组满了,则扩容(翻倍扩容)
                if (size == content.Length)
                {
                    //扩容次数为2的指数级
                    Object[] newArray = new Object[2 * content.Length];
                    //将原内容拷贝到新的数组中 (扩容次数 2的指数级扩容,减少拷贝带来的时间消耗)
                    Array.Copy(content,0,newArray,0,size);
                    content = newArray;
                }
                //写入数组
                content[size++] = obj;
            }
            /// <summary>
            /// 取下一个出栈值,但不删除 (偷看下~)
            /// </summary>
            /// <returns></returns>
            public virtual Object Peek()
            {
                if (size == 0)
                    throw new InvalidOperationException("空栈");
                return content[size - 1];
            }
            /// <summary>
            /// 出栈
            /// </summary>
            /// <returns></returns>
            public virtual Object Pop()
            {
                if (size == 0)
                    throw new InvalidOperationException("空栈");
                Object obj = content[--size];
                content[size] = null;
                return obj;
            }
            //实现该方法是为了 暂不实现 ICollection -
            public void ShowAll()
            {
    
                for (int i=size-1;i>=0;i--)
                {
                    Console.Write($" {content[i]}");
                }
                Console.WriteLine();
            }
        }
        /// <summary>
        /// 异步栈
        /// </summary>
        public class MySyncStack : MyStack
        {
            private MyStack myStack;
    
            private Object lookObj;
    
            public override void Push(Object value)
            {
                lock (lookObj)
                {
                    myStack.Push(value);
                }
            }
    
            public override Object Pop()
            {
                lock (lookObj)
                {
                    return myStack.Pop();
                }
            }
    
            public override Object Peek()
            {
                lock (lookObj)
                {
                    return myStack.Peek();
                }
            }
        }

    可以看出,其实栈还是用数组结构来实现的,异步栈在栈的基础上增加了锁。

    测试下:

    MyStack st = new MyStack();
    st.Push('A');
    st.Push('B');
    st.Push('C');
    st.Push('D');
    st.ShowAll();
    st.Push('E');
    st.ShowAll();
    st.Pop();
    st.Pop();
    st.Pop();
    st.ShowAll();
    Console.ReadLine();


  • 相关阅读:
    10、HTTP请求方法你知道多少?
    9、为什么服务器会缓存这一项功能?如何实现的?
    7、HTTP长连接和短连接的区别 8、什么是TCP粘包/拆包?发生的原因?
    zzulioj--1719--小胖的疑惑(整数划分+dp打表)
    nyoj--27--水池数目(dfs)
    hdoj--1016--Prime Ring Problem(递归回溯)
    zzulioj--1777--和尚特烦恼3——何时能下山(水题)
    zzulioj--1708--01串也疯狂之光棍也有伴(dp)
    zzulioj--1707--丧心病狂的计数(水题)
    zzulioj--1711--漂洋过海来看你(dfs+vector)
  • 原文地址:https://www.cnblogs.com/xtt321/p/13814563.html
Copyright © 2011-2022 走看看