c ++组合队列/堆栈的实现

时间:2014-10-24 05:26:46

标签: c++ stack queue

对于我最近的家庭作业,我应该实施一个" 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函数似乎并没有真正从数组中删除项目。相反,他们只是移动前后位置,实际上缩短了嘎嘎声。 帮助表示感谢,如果您想查看代码,请告知我们。因为我的问题更具概念性,我认为这可能是解决问题的最佳方法。

2 个答案:

答案 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。因此,您必须跟踪两个索引:startend。困难在于连续的活动元素可以跨越缓冲区的边界(即,开始元素的索引高于结束元素的索引。

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小于max0,则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.当你的结构已经满了,结束==再次开始,所以你必须考虑如何处理这个。最简单的方法就是保持元素的数量。