2009-11-04 119 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. 維護廣告訂單。

簡答:你不能這樣做,因爲上述要求是相互排斥的。

其中一個要求必須放寬。

爲了幫助你,而不必去猜測,我們需要什麼你正在嘗試做的更多的信息。