队列+堆栈C ++

时间:2009-11-04 18:45:12

标签: c++

如何在不启动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或增强。

3 个答案:

答案 0 :(得分:2)

不确定您的问题是什么。您是否正在尝试实施一个队列(可以作为一个堆栈工作,不需要quack)作为ring buffer

在这种情况下,您需要同时保存正面和背面索引。上面链接的文章中描述了这些机制。注意“困难”部分:特别是,您需要有一个额外的变量或注意将一个字段留空 - 否则您将不知道如何区分完全空的和完全完整的队列。

答案 1 :(得分:2)

嗯,排除stl似乎有点愚蠢,因为std::deque正是你想要的。摊销的恒定时间随机访问。从正面和背面摊销恒定的插入/移除时间。

这可以通过在开头和结尾具有额外空间的阵列来实现。当任何一端的空间不足时,分配一个具有两倍空间的新数组并将所有内容复制过来,同时在结尾和开头都有空格。您需要跟踪班级中的起始索引和结束索引。

答案 2 :(得分:-1)

在我看来,你有一些相互矛盾的要求:

  1. 你必须推到C ++数组原语的头部。
  2. 不移动所有现有元素。
  3. 维护广告订单。
  4. 简短回答:你不能这样做,因为上述要求是相互排斥的。

    必须放宽其中一项要求。

    为了帮助您而不必猜测,我们需要有关您要执行的操作的更多信息。