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

c++ Implementation of a combined queue/stack

本文关键字:c++ 实现 堆栈 队列 组合      更新时间:2023-10-16

对于我最新的家庭作业,我应该实现一个"庸医",它是循环队列和堆栈的组合。现在,我正在尝试围绕前两个函数,pushFront和pushBack。以下是它们工作原理的示例。

推送前(a( [a-----]

推送前(b( [a----b]

相反,如果首先调用 pushBack,则需要将项放在数组的第一个元素中,然后向后移动。

推回(a( [a-----]

推回(b( [ab----]

这是我感到困惑的地方:

1.( 使用模算术将前面从项目[0]换行到项目[最大-1]。我能想到的唯一解决方案是创建一个 if 语句,该语句在达到 [0] 时向前移动到 [max-1]。

2.( 为了使 pushBack 函数将值放置在 item[0] 中,它必须从 item[max-1] 开始(然后在放置项目之前"向后"移动(。问题是,如果首先调用 pushFront,则该位置中已经有一个项目。

3.(我想过使用 while(item[back] != null( 来移动它,但我稍后将编写的 pop 函数似乎并没有真正从数组中删除项目。相反,他们只是移动前后位置,实际上缩短了庸医。感谢帮助,如果您想查看代码,无论出于何种原因,请告诉我。因为我的问题更具概念性,所以我认为这可能是解决问题的最佳方式。

您的架构有些混乱。 我从您的解释中了解到,您有一个固定大小的max元素,并且您必须在前面和后面添加元素。

要在这样的循环缓冲区中执行此操作,您需要知道哪个是第一个活动元素,哪个是最后一个。因此,您必须跟踪两个索引: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(为了优雅地规避这些情况,模算术有助于:

如果小于 max (end + 1) % max则会导致end+1,如果它正好max,则会导致0。 模运算符%对于管理一种循环算术非常实用。

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(但是有一个悬而未决的问题,你必须考虑:

当遵循这个逻辑时,一开始你有 end==start,都是 0。当你的结构满了,end==重新开始,所以你必须考虑如何处理这个问题。 做出改变的最简单方法是保留元素的数量。

我相信函数 pushFront 应该将下一个字符推到列表的前面。 所以而不是

推送前(a( [a-----]

推送前(b( [a----b]

你应该得到,

推送前(a( [a-----]

推前(b( [ba----]

pushFront(c( [cba---]

推回(d( [cbad--]

无论哪种方式,您都不需要使用模运算符,直到您需要找到正面和背面。