c ++实现组合队列/堆栈
对于我最近的家庭作业,我应该实现一个“嘎嘎”,它是循环队列和堆栈的组合。 现在,我试图围绕前两个函数,pushFront和pushBack。 这是他们如何工作的一个例子。
pushFront(a)[a -----]
pushFront(b)[a ---- b]
相反,如果首先调用pushBack,则需要将该项目放置在数组的第一个元素中,然后再移回。
pushBack(a)[a -----]
pushBack(b)[ab ----]
这是我困惑的地方:
1.)使用模算术将项目[0]的前端包装到项目[max -1]中。 我能想到的唯一解决方案是创建一个if语句,当达到[0]时,将前移到[max-1]。
2.)为了使pushBack函数将值放入项目[0]中,它必须从项目[max-1]开始(然后在放置项目之前“向后移动”)。 问题是,如果首先调用pushFront,那么该位置已经有一个项目。
3.)我想过使用一段时间(item [back]!= null)来移动它,但我稍后编写的pop函数似乎并不真正从数组中移除项目。 相反,他们只是移动前后位置,实际上是缩短了嘎嘎。 感谢您的支持,如果您想查看代码,请随时告诉我。 因为我的问题更具概念性,所以我认为这可能是解决问题的最佳方式。
你的模式有点令人困惑。 我从你的解释中了解到,你有一个固定大小的max
元素bufer,并且你必须在前面和后面添加元素。
为了在这样的循环缓冲区中执行此操作,您需要知道哪个是第一个活动元素,哪个是最后一个。 所以你必须跟踪两个指标: start
和end
。 难点在于连续的活动元素可以跨越缓冲区的边界(即起始元素的索引高于结束元素的索引。
empty:
+----+----+----+----+
! ! ! ! ! start=0, end=0
---------------------
pushback(a):
+----+----+----+----+
! a ! ! ! ! start=0, end=1
---------------------
pushback(b):
+----+----+----+----+
! a ! b ! ! ! start=0, end=2
---------------------
pushfront(c):
+----+----+----+----+
! a ! b ! ! c ! start=max-1, end=2
---------------------
after a log of push and pop front and back :
+----+----+----+----+
! ! x ! y ! z ! start=1, end=0
---------------------
1)为了优雅地规避这些情况,modmodo算法有助于:
(end + 1) % max
效果在end+1
,如果它小于max
或0
,如果它是恰好max
。 模运算符%
对于管理一种循环算法是非常实用的。
2)考虑到这种观点,你的推回是(伪代码):
check that buffer is not full
add the element at end index and increment the index as explained in 1.
前沿是相似的,你必须在开始或开始之前添加一个元素(取决于结构是empy还是已经有元素)并且减少开始(因此提示:使用无符号整数类型,例如size_t您的索引为了能够从0递减时使用模数)。
事实上,你也有堆叠操作,这意味着你
3)考虑到这个逻辑,3应该不再是一个问题。
4)但是你需要考虑一个悬而未决的问题:
当遵循这个逻辑时,开始时你已经结束了==开始,都是0.当你的结构将满时,结束==再次开始,所以你必须考虑如何处理这个。 做出改变的最简单方法是保留元素的数量。
我相信功能pushFront应该推动下一个字符到列表的前面。 所以不是
pushFront(a)[a -----]
pushFront(b)[a ---- b]
你应该得到,
pushFront(a)[a -----]
pushFront(b)[ba ----]
pushFront(c)[cba ---]
pushBack(d)[cbad--]
无论哪种方式,你不应该需要使用模数运算符,直到你需要找到正面和背面。
链接地址: http://www.djcxy.com/p/79865.html上一篇: c++ Implementation of a combined queue/stack
下一篇: stack and queue