Stack 栈 ----Queue 队列

 一、概念

栈 Stack 先进后出的结构,队列 Queue 先进先出的结构 如图:

二 、 实现

  实现如上两个数据结构。 首先动手之前,Framework Design Guidelines这本书告述我们,在设计API或者实现类的时候,应当围绕场景编写API规格说明书

 1.1 实现栈

     对于栈提供

Stack<T>         :    创建一个 栈

 void Push(T s)  :   插入一个元素

 T Pop ()           :   推出最上的元素,删除并且返回这个元素

 T PopFirst()     :    返回最上面的元素,不删除

 void Clear()     :    清空栈元素

 int  Count        :    返回栈元素个数

 bool IsEmpty() :     是否为空

使用链表实现:

 在实现的时候,最关键的是思路,因为一开始由于思路问题出现了一个小错误 ,这里提醒一下自己,也是举一反三实现其他API 也是先理清思路然后逐步实现。

创建一个泛型类:

public class Stack<T>
{
   class Node
   {
      public T Item{get;set;}
      public Node NextNode{get;set;}
    }

其中使用 一个内部类 Node 用来实现链表 ,它包含两个元素,一个是这个节点的值 Item ,一个是链表指向下一个节点的引用。 这里将两个元素设置为属性。

   private Node first=null;
   private int numbers;

   public void Stack<T>()
   {
       numbers = 0;
   }

定义两个字段 ,一个节点实例,用来存储栈最近放入的元素。 一个int类型用来记录栈元素个数。

/// <summary>
    /// 推入一个元素
    /// </summary>
    /// <param name="s"></param>
   public void Push(T s)
   {
       Node oldFirst = first;
       first = new Node();
       first.Item = s;
       first.NextNode = oldFirst;
       numbers++;
   }

这里实现放入元素,先把当前的节点存储起来,以免引用丢失,把推入的元素设置为栈顶元素first。 要注意的一点是红色部分需要新分配一个内存,让first指向他。 这样每次推入一个元素就有个新的内存存储它,建立起了链表。

 /// <summary>
    /// 退出当前第一个元素并删除返回
    /// </summary>
    /// <returns></returns>
   public T Pop()
   {
       T value = first.Item; 
first=first.NextNode; //第二个节点代替第一个节点,原先第一个节点丢弃
numbers--; return value; }

首先要将当前栈顶的元素值存储用以返回,还要保存顶元素保存的指向下个指针的节点用来设置成新的顶元素。核心部分就是这么多。

使用数组实现:

用数组来存储元素值

posted @ 2016-01-10 17:21  bambom  阅读(342)  评论(0编辑  收藏  举报