堆栈的链接列表实现

时间:2013-03-27 13:06:05

标签: algorithm linked-list stack doubly-linked-list

这是我使用链表

的堆栈实现
STACK using linked list 

STACK-EMPTY:
if L.head == NIL
    return True
else return False

PUSH(x):
x.next = L.head 
if L.head != NIL
    L.head.prev = x
L.head = x
x.prev = NIL

POP():
x = L.head
L.head = x.next
x.next.prev = L.head
return x
你会验证这个吗?如何改善?

感谢

2 个答案:

答案 0 :(得分:1)

您可以改善数据结构的一致性:

  1. 列表头的prev始终为NIL
  2. 列表中没有的元素nextprev设置为NIL
  3. 考虑到你的POP存在不一致性,这可能是错误的来源:当你弹出一个元素时,头部的prev就是头部本身,当你按下一个元素prev时头部是NIL。

答案 1 :(得分:0)

试试这个......

说明:

  • S.top是指向堆栈顶部类型X的某个节点的指针
  • X是一个有两个指针的节点,topbase
  • X.top指向堆栈顶部的下一个节点。
  • X.base指向堆栈底部的下一个节点(底部)

首先初始化堆栈顶部指针:

STACK-INITIAL:
S.top = NIL
return true  // Never fails

测试空堆栈:

STACK-EMPTY:
return (S.top == NIL)

在堆栈上推送节点x

PUSH(x):
x.top = NIL     // Top of stack, therfore top is NIL
x.base = S.top  // base is previous top
S.top = x       // x is now top of stack  
return true

弹出并返回堆栈顶部(这是唯一'有趣'部分):

POP():
x = S.top          // Top node on stack (could be NIL)
if S.top != NIL    // Check in case stack was empty
  S.top = x.base   // New top = next node toward base
  x.base = NIL     // Disconnect x from stack
  if S.top != NIL  // Is stack now empty?
    S.top.top = NIL // No, set top node's top pointer to NIL
return x            // x could be NIL if stack was empty

要考虑的事情......我上面使用了双链表,因为 它看起来就像你正在使用的那样。但是,你只需要一个 单个链表,其中链接指向堆栈的基础。 请注意,上述算法中的x.top指针非常多 没用(设置但从未引用过)。只要你跟踪堆栈顶部(S.top)唯一的东西 您需要做的是在POP操作期间追溯堆栈。

对评论的回应

当一个元素从堆栈中移出时,它的所有关联 指针应设置为NIL。这是因为它不再是其中的一部分 堆栈的所以不应该指向任何堆栈元素。我补充说 我的原始答案(见上文)。

以类似的方式,堆栈元素的新顶部(除非堆栈变空) 需要指向它上面的元素 设置为NIL(因为它上面的元素被删除)。 在我的例子中,这是S.top.top = NIL 东西是关于(S.top指向顶部堆栈元素所以S.top.top是 该元素的顶部指针)。我想你会对x.next.prev = NIL做同样的事, 假设x是您弹出的元素,而不是NIL本身。在你的伪代码中它看起来 像x.next.prev = L.head这样会使堆栈元素顶部的prev指针指向自身 因为L.head被设置为x.next(在此之前的新堆栈顶部)。

最后,我质疑为什么要使用双链表 实现一个堆栈,只有一个带有指针的链表 它下面的下一个元素是必需的