堆栈实现Trollface方式

时间:2016-04-14 13:13:43

标签: algorithm stack

在我的软件工程课程中,我遇到了堆栈的以下特征,由我强调:你推送的是你弹出的内容。完全公理的版本我Uled here 作为一个天生的巨魔,我立刻发明了巨魔堆。如果它上面已经有超过1个元素,则推送会导致这些元素的随机排列。我很快就和讲师讨论这个无意义的实现是否真的违反了公理。我说不,顶部元素保持原样。他们说是的,不知怎的,你可以递归地应用push-pop-axiom来获得更深层次的"。我不明白。谁是对的?

2 个答案:

答案 0 :(得分:0)

在这样的情况下,对于每个人来说可能都很容易看到,但不适合你(因此你使用了“巨魔”这个词),在一张纸上简单地运行“程序”总是有帮助的。 / p>

记下当你按下并弹出几次时会发生什么,你会看到。

您还应该能够看到这些公理如何与堆栈的实际行为非常接近;它们不仅仅是为了好玩,而且它们深深地(在这个词的多个含义中)用它的方法指定数据结构。您甚至可以将它们视为描述堆栈输入和输出的“正式系统”。

请注意,怀疑仍然对你有好处;这导致a)更好的洞察力和b)检测你的上级所犯的错误。在这种情况下,它们是正确的,但有些情况下它可以为您节省大量时间(例如,在“Gödel,Escher,Bach”中搜索“MU”谜语的解决方案时,这对您来说是一个很好的读物,我想)。

答案 1 :(得分:0)

违反的公理是pop(push(s,x)) = s。使用s个不同的条目获取堆栈n > 1。如果您实施pushpush(s,x)s'xs's的随机排列,那么由于pop是一个函数,有问题:你如何反转random_permutation() pop(push(s,x)) = ss'的原像可能是n! > 1的任意s个排列,无论您映射到哪一个,都有n! - 1 > 0个其他原始排列{{1} } {为s''