我有一个抽象的数据类型,可以看作是从左到右存储的列表,具有以下可能的操作: 推送:在列表的左端添加一个新项目 弹出:删除列表左端的项目 拉:删除列表右端的项目
使用三个堆栈和常量额外内存实现此功能,以便任何推送,弹出或拉动操作的分摊时间保持不变。堆栈具有基本操作,isEmpty,Push和Pop。
摊销时间的意思是“如果我花费这么长时间,我可以花费另一块时间将其存放在一堆时间中以便以后使用。”就像每次推送操作一样,花费三个恒定时间的块,因此对于每个按下的元素,你有2个额外的恒定时间块。
答案 0 :(得分:10)
做出一些假设:
使用三个堆栈实现此目的 不断增加内存,这样 任何推,弹出的摊销时间, 或拉动操作是不变的。该 堆栈有基本操作,isEmpty, 推,然后弹出。
然后,我的第一个建议是忽略那些与你谈论链接列表的人。是的,这就是任何理性的人如何实现它没有三个堆栈要求,但是家庭作业的关键因素不是按照合理的人的方式去做,而是你的教练要你怎么做
我的第二点建议是获得一些积木,一副纸牌或一堆泡沫塑料杯并指定三个堆叠(例如带有杯垫或其他东西)。
,当你将一个堆栈的内容传输到另一个堆栈时会发生什么事情,开始四处游戏。答案 1 :(得分:3)
你可以做一些只使用3个堆栈的东西。想想tower of Hanoi。
答案 2 :(得分:2)
使用双向链表并保持指向头部和尾部的指针。对于其他人,您需要先编写自己的代码,然后让我们帮助您纠正它。
答案 3 :(得分:0)
首先根据两个堆栈(一个非常标准的问题)实现一个队列并进行概括。