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@
? ? ? ? ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Google是否在PHP中抓取include / require文件?
- 我正在使用PHP生成一个word文档,如何进行分页?
- php – 如何在订单收到的woocommerce结账页面上更改送货地
- php – codeigniter HMVC交叉模块调用控制器 – >方法
- Axis2 webservice入门--写个简单的webservice
- php-mysql-防止sql注入
- NumPy 教程(第 6 章): 从数值范围创建 Ndarray 数组
- 【SpringMVC】国际化&文件的上传&使用拦截器&异
- php – Symfony2 – 同一捆绑的2条路由(可选参数)
- Java Review (八、面向对象----成员变量和局部变量)