C#实现的堆栈

以前虽说也看过相关的数据结构方面的书籍,但是确实都是理解不深,今天翻看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对应的是移除节点!

posted @ 2012-02-14 11:47  梅子黄时雨  阅读(2669)  评论(0编辑  收藏  举报