在我的软件工程课程中,我遇到了堆栈的以下特征,由我强调:你推送的是你弹出的内容。完全公理的版本我Uled here 作为一个天生的巨魔,我立刻发明了巨魔堆。如果它上面已经有超过1个元素,则推送会导致这些元素的随机排列。我很快就和讲师讨论这个无意义的实现是否真的违反了公理。我说不,顶部元素保持原样。他们说是的,不知怎的,你可以递归地应用push-pop-axiom来获得更深层次的"。我不明白。谁是对的?
答案 0 :(得分:0)
在这样的情况下,对于每个人来说可能都很容易看到,但不适合你(因此你使用了“巨魔”这个词),在一张纸上简单地运行“程序”总是有帮助的。 / p>
记下当你按下并弹出几次时会发生什么,你会看到。
您还应该能够看到这些公理如何与堆栈的实际行为非常接近;它们不仅仅是为了好玩,而且它们深深地(在这个词的多个含义中)用它的方法指定数据结构。您甚至可以将它们视为描述堆栈输入和输出的“正式系统”。
请注意,怀疑仍然对你有好处;这导致a)更好的洞察力和b)检测你的上级所犯的错误。在这种情况下,它们是正确的,但有些情况下它可以为您节省大量时间(例如,在“Gödel,Escher,Bach”中搜索“MU”谜语的解决方案时,这对您来说是一个很好的读物,我想)。
答案 1 :(得分:0)
违反的公理是pop(push(s,x)) = s
。使用s
个不同的条目获取堆栈n > 1
。如果您实施push
,push(s,x)
为s'x
且s'
是s
的随机排列,那么由于pop
是一个函数,有问题:你如何反转random_permutation()
pop(push(s,x)) = s
? s'
的原像可能是n! > 1
的任意s
个排列,无论您映射到哪一个,都有n! - 1 > 0
个其他原始排列{{1} } {为s''
。