一、概念
栈 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; }
首先要将当前栈顶的元素值存储用以返回,还要保存顶元素保存的指向下个指针的节点用来设置成新的顶元素。核心部分就是这么多。
使用数组实现:
用数组来存储元素值