首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用单个数组实现三个堆栈

如何使用单个数组实现三个堆栈
EN

Stack Overflow用户
提问于 2010-06-17 16:37:15
回答 15查看 17.3K关注 0票数 16

我在一个面试网站上遇到了这个问题。该问题要求在单个数组中有效地实现三个堆栈,以便在整个数组空间中没有剩余空间之前没有堆栈溢出。

对于在一个数组中实现两个堆栈,很明显:第一个堆栈从左到右增长,第二个堆栈从右到左增长;当stackTopIndex交叉时,它发出溢出信号。

提前感谢你富有洞察力的回答。

EN

回答 15

Stack Overflow用户

发布于 2010-06-17 17:00:27

您可以使用实现三个堆栈:

  • 你需要一个指向下一个自由元素的指针。另外三个指针返回每个堆栈的最后一个元素(如果堆栈是空的,则返回null )。
  • 当堆栈添加另一个元素时,它必须使用第一个空闲元素并将空闲指针设置为下一个空闲元素(否则将引发溢出错误)。它自己的指针必须指向新的元素,从那里回到堆栈中的下一个元素。
  • 当堆栈移除一个元素时,它会把它交回空闲元素的列表中。堆栈的自身指针将重定向到堆栈中的下一个元素。

链表可以在数组中实现。

这(空间)效率如何?

通过为每个列表元素(值+指针)使用数组的两个单元来构建链表是没有问题的。根据规范的不同,你甚至可以将指针和值放入一个数组元素中(例如,数组很长,而值和指针只是整型的)。

将其与kgiannakakis的解决方案进行比较...损失高达50% (仅在最坏的情况下)。但我认为我的解决方案更清晰一些(也许更学术,这对于面试问题^^应该没有什么坏处)。

票数 15
EN

Stack Overflow用户

发布于 2010-06-20 08:31:54

请参阅Knuth, The Art of Computer Programming, Volume 1,第2.2.2节。标题为“顺序分配”。讨论在单个数组中分配多个队列/堆栈,以及处理溢出的算法等。

票数 10
EN

Stack Overflow用户

发布于 2010-08-16 23:49:33

我们可以使用长位数组来表示第i个数组单元属于哪个堆栈。我们可以取模3的值(00 -空,01 - A,10 - B,11 - C)。对于N大小的数组,需要N/2位或N/4字节的额外内存。

例如,对于1024个长整型元素(4096字节),只需要256个字节或6%。

这个位数组映射可以放在相同的数组中,在开始或结束时,只需将给定数组的大小缩小6%!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3060104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档