以前虽说也看过相关的数据结构方面的书籍,但是确实都是理解不深,今天翻看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: }
运行结果:
最开始光看代码怎么也没搞懂数据是如何存储的,通过跟踪才明白
第一步进行第一次Push操作,此时top为null,data值为100
通过Entry的构造函数进行赋值,之后我们可以看到top的值变成了这样
第二次push之后,top变成了这样:
通过上图可以看到,top的next变成了第一次push时top的值。
这是第三次push的结果,可以看到,每次都是把上一个的值作存储到next中
而pop则正好相反,这是pop之前的值:
通过top=top.next操作进行第一次pop之后:
最后一次push的值已经从堆栈中移除了。
通过这么简单的一个小例子,对数据结构的链表有了更加直观清晰的认识。
这就是数据结构中链表,push对应的添加节点,pop对应的是移除节点!