C# 为什么我的bool RemoveAll方法只返回false?
我必须为堆栈创建一个RemoveAll方法,该方法取出所有特定值,然后将其他值返回到原始堆栈。然而,我编写的方法只返回false。我的代码中有什么错误 以下是我写的方法:C# 为什么我的bool RemoveAll方法只返回false?,c#,stack,boolean,C#,Stack,Boolean,我必须为堆栈创建一个RemoveAll方法,该方法取出所有特定值,然后将其他值返回到原始堆栈。然而,我编写的方法只返回false。我的代码中有什么错误 以下是我写的方法: public bool RemoveAll(T item) { Stack<T> OurStack = new Stack<T>(); Stack<T> tempStack = new Stack<T>(); bool itemRemove = 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;
}
public bool RemoveAll(T项)
{
Stack-OurStack=新堆栈();
Stack tempStack=新堆栈();
bool itemrove=false;
OurListNode pTmp=mTop;
而(OurStack.Count>0)
{
if(pTmp.数据等于(项目))
{
itemRemove=true;
pTmp=pTmp.Next;
}
其他的
{
tempStack.Push(pTmp.Data);
}
}
而(tempStack.Count>0)
{
pTmp=pTmp.Next;
OurStack.Push(pTmp.Data);
}
返回项目删除;
}
以下是我为测试该方法而编写的主要内容:
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();
static void Main()
{
OurStack nums=新的OurStack();
推(1);
推(31);
推(22);
推(3);
//nums.RemoveAll(31);
Console.Write(nums.RemoveAll(1));
Console.ReadKey();
可能行-if(pTmp.Data.Equals(item))永远不会返回true,因此永远不会切换布尔值。在那里放置断点以查看。问题在于:
(OurStack.Count>0)
及
(tempStack.Count>0)
将始终为false,因为当函数启动时,您使用新对象初始化了OurStack和tempStack,所以它将始终为空(除非您在堆栈构造函数代码中添加了某些内容):
Stack-OurStack=newstack();
Stack tempStack=新堆栈();
所以这些列表总是空的…我们的堆栈是变量名还是类型名?在RemoveAll方法中,它被用作变量名,在测试方法中,它被用作类型。这很奇怪;当我调试时,它转到第一个while语句,然后跳到下一个while语句,而不遍历thr通过任何其他代码。我不知道它为什么会这样做…什么是
OurListNode pTmp=mTop;
,两个while
循环的中断条件是什么。您似乎只是在推数据离子堆栈,它会弹出堆栈并清空堆栈。两个while循环的中断条件应该是清空堆栈ack和tempStack。但是,该方法根本没有识别出MajkeloDev指出的任何数据正在放入。我使用pTmp作为指向堆栈顶部的临时指针。因此,当我编写pTmp=pTmp时。下一步--我尝试将其从其框架中弹出,分析其内容,然后将其完全从堆栈中删除或将其放入tempStack,但这并没有发生,因为我从来没有真正使它通过while循环线。当使用该方法时,我在添加到堆栈后调用它,并且第一个while语句不应该将数据推送到tempStack中吗?那么为什么列表仍然是空的呢?当我调试它时,它首先会经过添加到列表的过程,所以我知道我们的堆栈包含数据。但你是对的,它将它们标识为空,因为它先到第一个while语句,然后到第二个while语句,然后返回ItemRemove的原始值,该值为false。你知道为什么吗?@Stephanie你将我的答案标记为正确。你现在明白了吗,或者你想让我给你一些解释吗?我同意我会在调试程序时看到你是对的--我只是不知道如何修复它--所以如果你有时间再解释一下,我将不胜感激!
Stack<T> OurStack = new Stack<T>();
Stack<T> tempStack = new Stack<T>();