【CLRS】《算法导论》读书笔记(四):栈(Stack)、队列(Queue)和链表(Linked List)

栈(Stack)

维基百科: http://en.wikipedia.org/wiki/Stack_(abstract_data_type)

在栈中,被删除的是最近插入的元素:栈实现的是一种后进先出(last-in, first-out, LIFO)策略。

栈上的INSERT操作称为压入(PUSH), 而无元素参数的DELETE操作称为弹出(POP)。

【CLRS】《算法导论》读书笔记(四):栈(Stack)、队列(Queue)和链表(Linked List)_第1张图片

 

伪码:

STACK-EMPTY(S)

  if S.top == 0

    return TURE

  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]

 

队列

维基百科: http://en.wikipedia.org/wiki/Queue_(abstract_data_type) 

在队列中,被删去的总是在集合中存在时间最长的那个元素:队列实现的是一种先进先出(first-in, first-out, FIFO)。

队列上的INSERT操作称为入队(ENQUEUE),DELETE操作称为出队(DEQUEUE);如栈的POP操作一样,DEQUEUE操作也没有元素参数。

【CLRS】《算法导论》读书笔记(四):栈(Stack)、队列(Queue)和链表(Linked List)_第2张图片

 

伪码:

ENQUEUE(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

 

链表

维基百科: http://en.wikipedia.org/wiki/Linked_list

链表是一种这样的数据结构,其中的各对象按线性顺序排列。

单向链表:

双向链表:

循环链表:

 

伪码: 

(假设以下所处理的链表都是未排序的且是双链的)

LIST-SEARCH(L, k)

  x = L.head

  while 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

 

你可能感兴趣的:(【CLRS】《算法导论》读书笔记(四):栈(Stack)、队列(Queue)和链表(Linked List))