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

  1.  Stack st = new Stack();
  2. st.Push('A');
  3. st.Push('B');
  4. st.Push('C');
  5. st.Push('D');
  6. foreach (char c in st)
  7. {
  8. Console.Write(c + " ");
  9. }
  10. Console.WriteLine();
  11. st.Push('E');
  12. foreach (char c in st)
  13. {
  14. Console.Write(c + " ");
  15. }
  16. Console.WriteLine();
  17. st.Pop();
  18. st.Pop();
  19. st.Pop();
  20. foreach (char c in st)
  21. {
  22. Console.Write(c + " ");
  23. }
  24. Console.ReadLine();

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

  1.   /// <summary>
  2. /// 栈
  3. /// </summary>
  4. public class MyStack
  5. {
  6. /// <summary>
  7. /// 栈的实现还是使用数组的方式存储
  8. /// </summary>
  9. public Object[] content { get; set; }
  10. /// <summary>
  11. /// 栈深度
  12. /// </summary>
  13. public int size { get; set; }
  14. /// <summary>
  15. /// 默认开始深度
  16. /// </summary>
  17. public int defaultSize { get; set; } = 10;
  18. /// <summary>
  19. /// 初始化 默认深度
  20. /// </summary>
  21. public MyStack()
  22. {
  23. content = new object[defaultSize];
  24. size = 0;
  25. }
  26. /// <summary>
  27. /// 压栈
  28. /// </summary>
  29. /// <param name="obj"></param>
  30. public virtual void Push(Object obj)
  31. {
  32. //如果数组满了,则扩容(翻倍扩容)
  33. if (size == content.Length)
  34. {
  35. //扩容次数为2的指数级
  36. Object[] newArray = new Object[2 * content.Length];
  37. //将原内容拷贝到新的数组中 (扩容次数 2的指数级扩容,减少拷贝带来的时间消耗)
  38. Array.Copy(content,0,newArray,0,size);
  39. content = newArray;
  40. }
  41. //写入数组
  42. content[size++] = obj;
  43. }
  44. /// <summary>
  45. /// 取下一个出栈值,但不删除 (偷看下~)
  46. /// </summary>
  47. /// <returns></returns>
  48. public virtual Object Peek()
  49. {
  50. if (size == 0)
  51. throw new InvalidOperationException("空栈");
  52. return content[size - 1];
  53. }
  54. /// <summary>
  55. /// 出栈
  56. /// </summary>
  57. /// <returns></returns>
  58. public virtual Object Pop()
  59. {
  60. if (size == 0)
  61. throw new InvalidOperationException("空栈");
  62. Object obj = content[--size];
  63. content[size] = null;
  64. return obj;
  65. }
  66. //实现该方法是为了 暂不实现 ICollection -
  67. public void ShowAll()
  68. {
  69.  
  70. for (int i=size-1;i>=0;i--)
  71. {
  72. Console.Write($" {content[i]}");
  73. }
  74. Console.WriteLine();
  75. }
  76. }
  77. /// <summary>
  78. /// 异步栈
  79. /// </summary>
  80. public class MySyncStack : MyStack
  81. {
  82. private MyStack myStack;
  83.  
  84. private Object lookObj;
  85.  
  86. public override void Push(Object value)
  87. {
  88. lock (lookObj)
  89. {
  90. myStack.Push(value);
  91. }
  92. }
  93.  
  94. public override Object Pop()
  95. {
  96. lock (lookObj)
  97. {
  98. return myStack.Pop();
  99. }
  100. }
  101.  
  102. public override Object Peek()
  103. {
  104. lock (lookObj)
  105. {
  106. return myStack.Peek();
  107. }
  108. }
  109. }

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

测试下:

  1. MyStack st = new MyStack();
  2. st.Push('A');
  3. st.Push('B');
  4. st.Push('C');
  5. st.Push('D');
  6. st.ShowAll();
  7. st.Push('E');
  8. st.ShowAll();
  9. st.Pop();
  10. st.Pop();
  11. st.Pop();
  12. st.ShowAll();
  13. Console.ReadLine();


C#数据结构-栈的更多相关文章

  1. 数据结构——栈(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...

  2. C++ 泛型 编写的 数据结构 栈

    平时编程里经常需要用到数据结构,比如  栈和队列 等,  为了避免每次用到都需要重新编写的麻烦现将  C++ 编写的 数据结构   栈   记录下来,以备后用. 将 数据结构  栈   用头文件的形式 ...

  3. C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作

    1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...

  4. 数据结构——栈的实现(数组、Java)

    巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...

  5. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  6. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  7. (js描述的)数据结构[栈结构](2)

    (js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...

  8. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  9. openssl stack 数据结构栈基本操作

    堆栈是两种不同的数据结构: 堆:数据先进先出: 栈:数据先进后观: 在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据. open ...

  10. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

随机推荐

  1. nginx模块化结构

    NGINX是一个免费.开源.高性能.轻量级的HTTP和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器 特点: 占有内存少,并发能力强 Nginx的优点: 模块化.事件驱动.异步.非阻 ...

  2. 转载:使用java获取某A股当天/上一交易日的交易基本信息

    整个程序是借用了新浪的对外股票接口http://hq.sinajs.cn/list=sh603696,如果把这个地址放到浏览器地址栏里,你将看到: var hq_str_sh603696=" ...

  3. Java实现内嵌浏览器

    创建项目 ---->   导入需要的jar ---->  代码实现 需要的jar: https://pan.baidu.com/s/1MEZ1S0LnKSMGQm24QWgmCw 代码: ...

  4. selenium常用api之切换:table切换、alert弹框切换、iframe框架切换

    10.查看浏览器打开了多少个table和当前页面在哪个table 测试:打开了浏览器后,打开了一个新的标签页之后,显示此时有2个table,浏览器中当前页面展示的是第2个页面,但是代码打印显示的仍然是 ...

  5. Unit2:活动

    1.基本用法 1.创建活动 Generate LayoutFile 创建布局文件 Launcher Activity 自动注册为主活动 编写顺序 活动Activity 注册.xml 界面res.xx ...

  6. 教你一招Linux下文本比对方法

    我们在写代码的过程中,免不了会对代码进行一些修修改改.但经常会出现改着改着,就不知道改完后与源文件的差异是怎样的.这里,我们就需要一个文本比对工具来进行文本比对. 有经验的程序员都知道,Windows ...

  7. matlab数字图像简单的加密方法

    图像加密的重要性可想而知,每个人都会有自己的小秘密,通过图像加密的方法可以保护自己的照片等的安全. 一般情况下,图像加密可以分为以下几个步骤: 1.选择图像加密算法 2.根据算法获取秘钥 3.根据保存 ...

  8. thinkPHP5.1 MVC架构使用方法

    MVC架构 1.M层:model(模型),是增强版的数据库 M层是用来存放自动完成代码.修改器(数据修改).模型事件.验证器 2.V层:view 显示视图 V层用来存放HTML.css.JavaScr ...

  9. javascript操作多选下拉列表

    闲来无事,把javascript操作多选下拉列表有关的操作知识复习了一遍,代码附上 <%-- Created by IntelliJ IDEA. User: Administrator Date ...

  10. Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比

    Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比: Unix/Linux (Bash) Windows(MS-DOS) Java 进入目录 cd cd - 创建 ...