如何在不启动MAXSIZE-1的情况下将项目推送到数组的前面(如堆栈)?我一直在尝试使用模数运算符来实现这一点。
bool quack::pushFront(const int nPushFront)
{
if ( count == maxSize ) // indicates a full array
{
return false;
}
else if ( count == 0 )
{
++count;
items[0].n = nPushFront;
return true;
}
intBack = intFront;
items[++intBack] = items[intFront];
++count;
items[(top+(count)+maxSize)%maxSize].n = nPushFront;
/*
for ( int shift = count - 1; shift >= 0; --shift )
{
items[shift] = i€tems[shift-1];
}
items[top+1].n = nPushFront; */
return true;
}
“quack”表示队列和堆栈之间的交叉。我不能简单地将我的元素移动1,因为它非常低效。我已经为此工作了一个多月了。我只需要使用模数运算符来指导push_front ...我不认为循环是必要的。
它很有趣,因为我需要随机打印列表。因此,如果我开始向我的整数数组的MAXSIZE-1元素添加值,然后需要打印数组,我将有垃圾值..
not actual code:
pushFront(2);
pushFront(4);
cout << q;
如果我们从后面开始添加,我会得到几个空值。 我不能简单地将数组元素向下或向上移动一个。
我无法使用任何stls或增强。
答案 0 :(得分:2)
不确定您的问题是什么。您是否正在尝试实施一个队列(也可以作为一个堆栈工作,不需要quack
)作为ring buffer?
在这种情况下,您需要同时保存正面和背面索引。上面链接的文章中描述了这些机制。注意“困难”部分:特别是,您需要有一个额外的变量或注意将一个字段留空 - 否则您将不知道如何区分完全空的和完全完整的队列。
答案 1 :(得分:2)
嗯,排除stl似乎有点愚蠢,因为std::deque
正是你想要的。摊销的恒定时间随机访问。从正面和背面摊销恒定的插入/移除时间。
这可以通过在开头和结尾具有额外空间的阵列来实现。当任何一端的空间不足时,分配一个具有两倍空间的新数组并将所有内容复制过来,同时在结尾和开头都有空格。您需要跟踪班级中的起始索引和结束索引。
答案 2 :(得分:-1)
在我看来,你有一些相互矛盾的要求:
简短回答:你不能这样做,因为上述要求是相互排斥的。
必须放宽其中一项要求。
为了帮助您而不必猜测,我们需要有关您要执行的操作的更多信息。