2016-09-18 109 views
-1

我必須爲堆棧創建一個RemoveAll方法,該方法取出所有特定值,然後將其他值返回到原始堆棧。然而,我寫的方法只返回false。我的代碼中有什麼錯誤?爲什麼我的布爾RemoveAll方法只返回false?

這是我寫的方法:

public bool RemoveAll(T item) 
{ 
    Stack<T> OurStack = new Stack<T>(); 
    Stack<T> tempStack = new Stack<T>(); 
    bool itemRemove = false; 
    OurListNode<T> pTmp = mTop; 

    while (OurStack.Count > 0) 
    { 
     if (pTmp.Data.Equals(item)) 
     { 
      itemRemove = true; 
      pTmp = pTmp.Next; 
     } 
     else 
     { 
      tempStack.Push(pTmp.Data); 
     } 
    } 
    while (tempStack.Count > 0) 
    { 
     pTmp = pTmp.Next; 
     OurStack.Push(pTmp.Data); 
    } 
    return itemRemove; 
} 

這是我寫的測試方法主要:

static void Main() 
{ 
    OurStack<int> nums = new OurStack<int>(); 
    nums.Push(1); 
    nums.Push(31); 
    nums.Push(22); 
    nums.Push(3); 
    //nums.RemoveAll(31); 

    Console.Write(nums.RemoveAll(1)); 
    Console.ReadKey(); 
+0

什麼是'OurListNode pTmp = mTop;',兩個'while'循環的中斷條件是什麼。您似乎只推送數據離子堆棧,並彈出堆棧並清空堆棧 –

+0

兩個while循環的中斷條件應爲清空堆棧OurStack和tempStack。然而,這個方法並沒有意識到MajkeloDev指出任何數據都被放入。我使用pTmp作爲棧頂的臨時指針。所以當我寫pTmp = pTmp.Next時 - 我試圖將其從框架中彈出,分析其內容,然後將其從堆棧中完全移除或放置在tempStack中,但這不會發生,因爲我永遠不要讓它通過while循環線。 – Stephanie

回答

2

的問題是:

(OurStack.Count> 0)

(tempStack.Count> 0)

始終將當函數啓動時你會錯誤地使用new ob初始化OurStack和tempStack JECT所以它永遠是空的(除非您要添加堆疊構造函數代碼的東西):

Stack<T> OurStack = new Stack<T>(); 
Stack<T> tempStack = new Stack<T>(); 

因此,這些列表會一直是空的......

+0

當使用該方法時,我在添加到我們的堆棧之後調用它,而不應該在第一個語句將數據推入tempStack?那爲什麼這些清單仍然是空的?當我調試它首先通過添加到列表的過程 - 所以我知道OurStack包含數據。但是你是對的,它將它們識別爲空,因爲它先到達第一個語句,然後到第二個,然後返回錯誤的ItemRemove的原始值。任何想法爲什麼? – Stephanie

+0

@Stephanie你標記我的答案是正確的。你現在明白了嗎,還是你希望我給你更多的解釋? – MajkeloDev

+0

我可以在調試程序時看到你是對的 - 我只是不知道如何解決它 - 所以如果你有時間多解釋一下,我會很感激! – Stephanie

0

也許行 - 如果(pTmp.Data.Equals(項目))是永不返回真實,從而永遠不會切換布爾。在那裏放一個斷點來看看。

+0

這是奇怪的事情;當我調試它時,首先while語句,然後跳轉到下一個while語句,而不通過任何其他代碼。我不知道它爲什麼這樣做... – Stephanie

0

是可變的OurStack名稱或一種?在RemoveAll方法中,它用作變量名稱,在測試方法中,它用作類型。

相關問題