对于我最近的家庭作业,我应该实施一个" quack"这是循环队列和堆栈的组合。 现在,我试图围绕前两个函数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函数将值放在item [0]中,它必须从项目[max-1]开始(然后移动"向后"在放置项目之前) 。问题是,如果首先调用pushFront,那么该位置已经有了一个项目。
3.)我想过使用一段时间(item [back]!= null)来浏览它,但我稍后写的pop函数似乎并没有真正从数组中删除项目。相反,他们只是移动前后位置,实际上缩短了嘎嘎声。 帮助表示感谢,如果您想查看代码,请告知我们。因为我的问题更具概念性,我认为这可能是解决问题的最佳方法。
答案 0 :(得分:0)
我相信函数pushFront应该将下一个char推入列表的前面。所以而不是
pushFront(a)[a -----]
pushFront(b)[a ---- b]
你应该得到,
pushFront(a)[a -----]
pushFront(b)[ba ----]
pushFront(c)[cba ---]
pushBack(d)[cbad - ]
无论哪种方式,您都不需要使用模数运算符,直到您需要找到正面和背面。
答案 1 :(得分:0)
您的架构有点令人困惑。我从您的解释中了解到,您有max
元素的固定大小缓冲,并且您必须在前面和后面添加元素。
要在这样的循环缓冲区中执行此操作,您需要知道哪个是first active element and which is the last。因此,您必须跟踪两个索引: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)为了优雅地规避这些情况,modulto算法有助于:
(end + 1) % max
如果end+1
小于max
或0
,则max
会产生%
。模运算符check that buffer is not full
add the element at end index and increment the index as explained in 1.
对于管理一种循环算术非常实用。
2)考虑到这个观点,你的推回是(伪代码):
{{1}}
pushfront类似于你必须在开始时或开始之前添加元素(取决于结构是否为empy或者是否已经存在元素)和减少开始(因此提示:使用无符号整数类型,如作为索引的size_t,以便能够在从0开始递减时使用模数。
你也有堆叠操作,这意味着你
<3>考虑到这一逻辑,3应该不再是一个问题。4)但是你需要考虑一个未解决的问题:
当遵循这个逻辑时,在开头你有结尾==开始,都是0.当你的结构已经满了,结束==再次开始,所以你必须考虑如何处理这个。最简单的方法就是保持元素的数量。