组合队列/堆栈的 c++ 实现
c++ Implementation of a combined queue/stack
对于我最新的家庭作业,我应该实现一个"庸医",它是循环队列和堆栈的组合。现在,我正在尝试围绕前两个函数,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
元素,并且您必须在前面和后面添加元素。
要在这样的循环缓冲区中执行此操作,您需要知道哪个是第一个活动元素,哪个是最后一个。因此,您必须跟踪两个索引: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(为了优雅地规避这些情况,模算术有助于:
如果小于 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--]
无论哪种方式,您都不需要使用模运算符,直到您需要找到正面和背面。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的