2016-09-18 129 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方法中,它用作变量名称,在测试方法中,它用作类型。