惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
小众软件
小众软件
博客园_首页
博客园 - 聂微东
V
V2EX
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
SegmentFault 最新的问题
J
Java Code Geeks
Last Week in AI
Last Week in AI
The Cloudflare Blog
月光博客
月光博客
雷峰网
雷峰网
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
博客园 - Franky
腾讯CDC
Jina AI
Jina AI
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
量子位
爱范儿
爱范儿
美团技术团队
T
Tailwind CSS Blog
博客园 - 【当耐特】
D
Docker
IT之家
IT之家
V
Visual Studio Blog
P
Proofpoint News Feed
L
LangChain Blog
Engineering at Meta
Engineering at Meta
C
Check Point Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Recorded Future
Recorded Future

博客园 - 梅子黄时雨

离职反思 人际交往能力:远比你想象的重要 关于晋升 生产力提升计划 向企业一样的思考 在CentOS上搭建WordPress的博客系统 Some Useful LINQ Extension Methods MVC模式 IIS7.5配置 An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode. C# 整数和byte数组互换 显式接口成员实现 ASP.NET 验证控件 Gridview中合并单元格,某字段的内容相同时如何只显示一个,屏蔽相同列或行的内容(转) C#winform 配置webconfig 动态SQL EXEC DELL 1520 笔记本拆机 关于表变量 华为致新员工书
C#实现的堆栈
梅子黄时雨 · 2012-02-14 · via 博客园 - 梅子黄时雨

以前虽说也看过相关的数据结构方面的书籍,但是确实都是理解不深,今天翻看C#语言规范4.0,看到一个示例就是用C#实现的堆栈,代码如下

   1:  using System;
   2:  namespace Jax.Collections
   3:  {
   4:      public class Stack
   5:      {
   6:          Entry top;
   7:          public void Push(object data)
   8:          {
   9:              top=new Entry(top,data);
  10:          }
  11:          public object Pop()
  12:          {
  13:              if(top== null)
  14:              {
  15:                  throw new InvalidOperationException();
  16:              }
  17:              object result = top.data;
  18:              top = top.next;
  19:              return result;
  20:          }
  21:          class Entry
  22:          {
  23:              public Entry next;
  24:              public object data;
  25:              public Entry(Entry next,object data)
  26:              {
  27:                  this.next = next;
  28:                  this.data = data;
  29:              }
  30:          }
  31:      }
  32:  }

测试代码:

   1:  using System;
   2:  using Jax.Collections;
   3:  class Test
   4:  {
   5:      static void Main()
   6:      {
   7:          Stack s = new Stack();
   8:          s.Push(100);
   9:          s.Push("Jax");
  10:          s.Push(200);
  11:          Console.WriteLine(s.Pop());
  12:          Console.WriteLine(s.Pop());
  13:          Console.WriteLine(s.Pop());
  14:          Console.ReadLine();
  15:      }
  16:  }

运行结果:

MSNLitePic 2012-02-14 11_31_33

最开始光看代码怎么也没搞懂数据是如何存储的,通过跟踪才明白

第一步进行第一次Push操作,此时top为null,data值为100

image

通过Entry的构造函数进行赋值,之后我们可以看到top的值变成了这样

image

第二次push之后,top变成了这样:

image

通过上图可以看到,top的next变成了第一次push时top的值。

这是第三次push的结果,可以看到,每次都是把上一个的值作存储到next中

image

而pop则正好相反,这是pop之前的值:

image

通过top=top.next操作进行第一次pop之后:

image

image

最后一次push的值已经从堆栈中移除了。

通过这么简单的一个小例子,对数据结构的链表有了更加直观清晰的认识。

这就是数据结构中链表,push对应的添加节点,pop对应的是移除节点!