加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

C#数据结构-栈

发布时间:2021-05-21 07:25:57 所属栏目:大数据 来源: https://www.jb51.cc
导读:栈的定义不需要多说,相信大家都非常熟悉,但是,在实际应用中栈的应用我们很少想到会去用栈结构,先上代码看下用法: Stack st = new@H_502_5@ Stack(); st.Push(@H_502_5@ '@H_502_5@ A@H_502_5@ '@H_502_5@ ); st.Push(@H_502_5@ B@H_502_5@ C@H_502_5@ D

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

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

?

?

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

?

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

            @H_502_5@for@H_502_5@ (int@H_502_5@ i=size-1@H_502_5@;i>=0@H_502_5@;i--)
            {
                Console.Write($@H_502_5@ {content[i]}@H_502_5@);
            }
            Console.WriteLine();
        }
    }
    @H_502_5@ 异步栈
    @H_502_5@ MySyncStack : MyStack
    {
        @H_502_5@private@H_502_5@ MyStack myStack;

        @H_502_5@ Object lookObj;

        @H_502_5@override@H_502_5@  Push(Object value)
        {
            @H_502_5@lock@H_502_5@ (lookObj)
            {
                myStack.Push(value);
            }
        }

        @H_502_5@override@H_502_5@ (lookObj)
            {
                @H_502_5@ myStack.Pop();
            }
        }

        @H_502_5@ myStack.Peek();
            }
        }
    }@H_502_5@

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

?

测试下:

MyStack st =  MyStack();
st.Push(@H_502_5@);
st.Push(@H_502_5@);
st.ShowAll();
st.Push(@H_502_5@);
st.ShowAll();
st.Pop();
st.Pop();
st.Pop();
st.ShowAll();
Console.ReadLine();@H_502_5@

?

?


?

?

?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读