第十章——基本数据结构
一.栈和队列
栈实现的是一种后进先出的策略,被删除的是最近插入的元素,可以把栈想象成一个盒子,插入的元素相当于是往里面放一个物品,删除元素相当于把最上面的物品拿出来。
队列实现的是一种先进先出的策略,被删除的总是在集合中存在时间最长的那个元素,可以把队列想象成人在排队,插入元素相当于是往队伍的最后面放上一个人,删除则是把第一个人去除掉。
栈的相关操作伪代码:
STACK-EMPTY(S)
if S.top == 0
return TURE
else return FALSE
PUSH(S,x)
S.top += 1
S[S.top] = x
POP(S)
if STACK-EMPTY(S)
error "underflow"
else S.top -= 1
return S[S.top+1]
队列的相关操作伪代码:
ENQUEUE(Q,x) //入队
Q[Q.tail] = x
if Q.tail == Q.length
Q.tail = 1
else Q.tail += 1
DEQUEUE(Q) //出队
x = Q[Q.head]
if Q.head = Q.length
Q.head = 1
else Q.head += 1
return x
二.链表
链表的相关操作的伪代码:
LIST-SEARCH(L,k) //链表的搜索
x = L.head
whild x != NIL and x.key != k
x = x.next
return x
LIST-INSERT(L,x) //链表的插入
x.next = L.head
if L.head != NIL
L.head.prev = x
L.head = x
x.prev =NIL
LIST-DELETE(L,x) //链表的删除
if x.prev != NIL
x.prev.next = x.next
else L.head = x.next
if x.next != NIL
x.next.prev = x.prev
链表操作可以设置哨兵结点,使得链表的各种操作更为简单,简化边界条件的处理。
三.指针和对象的实现
当有些语言不支持指针和对象数据类型的时候,可以采用数组和数组下标来构造对象和指针。
对象的多数组表示
对象的单数组表示
对象的分配与释放
四.有根树的表示
二叉树
分支无限制的有根树
左孩子右兄弟表示法:
1.x.left-child指向x的最左边的孩子结点
2.x.right-sibling指向x右侧相邻的兄弟结点
如果结点x没有孩子结点,则x.left-child=NIL;如果结点x是其父结点的最右孩子,则x.right-sibling=NIL。