算法导论 第十章 基本数据结构

基本数据结构

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)的存储空间:左孩子右兄弟表示法。

  1. x.left-child指向结点x最左边的孩子结点;
  2. x.right-sibling指向x右侧相邻的兄弟结点。

如果x没有孩子结点,则x.left-child=null,如果结点x是其父结点的最右孩子,则x.right-sibling=null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值