基本数据结构
10.1 栈和队列
栈(LIFO)
栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素都是预先设定的。
STACK-EMPTY(S)
if S.top==0
return TRUE
else
return FALSE
PUSH(S, x)
S.top=S.top+1
S[S.top]=x
POP(S)
if STACK-EMPTY(S)
error "underflow"
else
S.top=S.top-1
return S[S.top+1]
队列(FIFO)
EUQUEUE(Q, x)
Q[Q.tail]=x
if Q.tail==Q.length
Q.tail=1
else
Q.tail=Q.tail+1
DEQUEUE(Q)
x=Q[Q.head]
if Q.head==Q.length
Q.head=1
else
Q.head=Q.head+1
return x
10.2 链表
链表中各对象按线形顺序排列。双向链表L的每个元素都是一个对象,每个对象有一个关键字key和两个指针,分别是next和prev。对象中可以包含其他的辅助数据(或称卫星数据)。
LIST-SEARCH(L, k)
x=L.head
while x!=null and x.key!=k
x=x.next
return x
LIST-INSERT(L, x)
x.next=L.head
if L.head!=null
L.head.prev=x
L.head=x
x.prev=null
LIST-DELETE(L, x)
if x.prev!=null
x.prev.next=x.next
else
L.head=x.next
if x.next!=null
x.next.prev=x.prev
哨兵
如果可以忽视表头和表尾处的边界条件,则LIST-DELETE的代码可以更简单些:
LIST-DELETE(L, x)
x.prev.next=x.next
x.next.prev=x.prev
哨兵(sentinel)是一个哑对象,其作用是简化边界条件的处理。
10.4 有根数的表示
有一个巧妙的方法可以用来表示孩子数任意的树,该方法的优势自傲与,对任意n个结点的有根数,只需要O(n)的存储空间:左孩子右兄弟表示法。
- x.left-child指向结点x最左边的孩子结点;
- x.right-sibling指向x右侧相邻的兄弟结点。
如果x没有孩子结点,则x.left-child=null,如果结点x是其父结点的最右孩子,则x.right-sibling=null。