这是我使用链表
的堆栈实现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
你会验证这个吗?如何改善?
感谢
答案 0 :(得分:1)
您可以改善数据结构的一致性:
prev
始终为NIL
next
和prev
设置为NIL 考虑到你的POP存在不一致性,这可能是错误的来源:当你弹出一个元素时,头部的prev
就是头部本身,当你按下一个元素prev
时头部是NIL。
答案 1 :(得分:0)
试试这个......
说明:
S.top
是指向堆栈顶部类型X
的某个节点的指针X
是一个有两个指针的节点,top
和base
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
(在此之前的新堆栈顶部)。
最后,我质疑为什么要使用双链表 实现一个堆栈,只有一个带有指针的链表 它下面的下一个元素是必需的