2009-11-04 197 views
-1

如何在没有以MAXSIZE-1开始的情况下将项目推到数组的前端(如堆栈)?我一直在试图使用模运算符这样做..队列+堆栈C++

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;  
    } 

“江湖”,意思是队列和堆栈之间的交叉。我不能简单地将我的元素移动1,因为它非常低效。我已经为此工作了一个多月。我只需要使用模运算符来指导push_front ...我不认为循环甚至是必要的。

它很有趣,因为我需要随机打印列表。所以,如果我开始增加值到我的整数数组的MAXSIZE-1元素,然后需要打印的阵列,我会有垃圾值..

not actual code: 

pushFront(2); 
pushFront(4); 
cout << q;  

如果我们开始从后面将我会得到一些空值。 我不能简单地将数组元素向下或向上移动一个。

我不能使用任何stls或boosts。

+0

为什么不能使用STL,这是C++的标准部分,已经有十多年了? – ChrisInEdmonton 2009-11-04 18:51:46

+6

“我已经为此工作了一个多月了。”如果您没有提供足够的信息并且不回答其他人提出的问题,则需要花费更长的时间:http:// stackoverflow。com/questions/1665459/1665507#1665507无法提供足够的信息而无休止地重复发布相同的问题不会帮助你。 – sbi 2009-11-04 18:52:54

+0

@ChrisInEdmonton,如果这是一项家庭作业问题,那么使用STL或Boost将删除此数据结构分配的任何学习值。 – 2009-11-04 19:01:30

回答

2

不知道你的问题是什么。你们是不是要实现一个队列(其中可以作为一个栈,不需要你quack工作)作为ring buffer

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

+0

我只是不能让它正常工作..我已经看过这么多次维基链接:/ – user40120 2009-11-04 18:52:38

+2

@lampshade:这是一个有效的观点。但在这种情况下,您*必须提供更多信息*。正如你已经怀疑的那样,你的代码是解决这个问题的完全错误的方式,但你不清楚问题出在哪里。我不知道你想实现什么,你的成员变量代表什么或者问题是什么。 – 2009-11-04 19:03:37

2

嗯,这似乎有点傻排除STL,因为std::deque是你想要什么。摊销恒定时间随机存取。从正面和背面均摊不变的插入/取出时间。

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

+0

+1这是首先想到的......如果对STL使用有限制,它可能是一项家庭作业。 – Marcin 2009-11-04 19:27:20

+0

但是,如果它*是一项家庭作业,那么他一直没有为此工作“一个多月。”写入环形缓冲区或双端队列的任务至多需要两周的最后期限。 – 2009-11-04 20:42:17

+0

deque表示双端队列 – sergiol 2016-05-08 23:33:37

-1

在我看来,你有一些相互冲突的要求:

  1. 你要推到一个C++阵列原始的头部。
  2. 不移动所有现有的元素。
  3. 维护广告订单。

简答:你不能这样做,因为上述要求是相互排斥的。

其中一个要求必须放宽。

为了帮助你,而不必去猜测,我们需要什么你正在尝试做的更多的信息。