繁体   English   中英

队列+堆栈C ++

[英]Queue + Stack C++

您如何在不从MAXSIZE-1开始的情况下将Items推到数组的前面(如堆栈)? 我一直在尝试使用模运算符。

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;    

如果我们从后面开始添加,我将得到几个空值。 我不能只是简单地将数组元素上下移动一个。

我不能使用任何STL或助推器。

不知道您的问题是什么。 您是否要实现将队列( 可以作为堆栈工作,不需要quack )作为环形缓冲区

在这种情况下,您需要同时保存前索引和后索引。 有关机制,请参见上面链接的文章。 请注意“难点”部分:尤其是,您需要具有一个额外的变量,或者要注意将一个字段留空–否则,您将不知道如何区分完全空队列和完全满队列。

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

这可以通过在开头和结尾处留有额外空间的数组来实现。 当两端的空间都用完时,请分配一个具有两倍空间的新数组,然后复制所有内容,并在结尾和开头都重新分配一个空间。 您需要跟踪班级中的开始索引和结束索引。

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

  1. 您必须将其推到C ++数组原语的开头。
  2. 无需转移所有现有元素。
  3. 保持插入顺序。

简短的回答:您不能这样做,因为上述要求是互斥的。

这些要求之一必须放宽。

为了帮助您而不必猜测,我们需要有关您要做什么的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM