我正在研究C#中的一个项目,其中一个问题是创建一个接收堆栈的程序并返回一个新堆栈,其中包含出现在该堆栈中的数字(出现的每个数字都在新堆栈只有一次)。
我制作了这个代码,它工作得很好,但在中间它只是停止工作并且它给出了这个错误“Unhandled Exception:OutOfMemoryException”。
我想知道这是什么问题?根据我的理解,它发生是因为我的程序需要的内存比计算机所能提供的内存多。如我错了请纠正我。
有谁知道我可以做些什么来解决这个问题,或者我如何改进我的代码以防止这种情况发生?
我可以在代码中做些什么来防止将来发生此问题?
非常感谢您提前。 :)
public static Stack<int> Stk(Stack<int> S)
{
int Num;
Stack<int> New = new Stack<int>();
while (!S.IsEmpty())
{
Num = S.Pop();
while (Num != 0)
{
if (!Check(New, (Num % 10)))
{
New.Push(Num % 10);
}
Console.WriteLine("Original Stack: " + New);
Num = Num / 10;
}
}
return New;
}
public static bool Check(Stack<int> S, int num)
{
Stack<int> Temp = new Stack<int>();
while (!S.IsEmpty())
{
Console.WriteLine("Stack Temp: " + Temp);
if (num == S.Top())
{
while (!Temp.IsEmpty())
{
S.Push(Temp.Top());
}
Console.WriteLine("Number found in Stack S!");
Console.WriteLine("Stack S: " + S);
return true;
}
Temp.Push(S.Pop());
}
while (!Temp.IsEmpty())
{
S.Push(Temp.Pop());
}
Console.WriteLine("Stack S: " + S);
Console.WriteLine("Number NOT found in Stack S!");
return false;
}
答案 0 :(得分:0)
if (num == S.Top())
{
while (!Temp.IsEmpty()) // Infinite loop, Temp is never empty
{
S.Push(Temp.Top()); // Because of infinite loop, S is just going to fill up memory
}
//...
我对Top()
上的Stack<T>
不熟悉,但从代码的其余部分判断它看起来不会从堆栈中删除一个对象(我知道的那个函数确实如此)这是Peek
)。如果是这种情况,你就会有一个无限循环,它会填满所有可用的内存并最终耗尽。
修改:此答案主要针对您遇到的问题。这对我来说闻起来像家庭作业,所以我不打算重写它,但我建议在@ ckuri的评论中支付这个答案。看起来你做的工作比你应该做的要多得多。您可能希望查看迭代堆栈而不是弹出一个全新的堆栈。