OutOfMemoryException,Loop/While 的结果?
OutOfMemoryException, Result of Loop/While?
我正在用 C# 开发一个项目,其中一个问题是制作一个接收 Stack 和 returns 新 Stack 的程序,其中包含出现在该堆栈中的数字(每个数字出现的只会在新堆栈中出现一次)。
我编写了这段代码,它工作得很好,但在中间它停止工作并给出了这个错误 "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;
}
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
}
//...
我不熟悉 Stack<T>
上的 Top()
,但从其余代码来看,它似乎不会从堆栈中删除对象(我知道的函数这样做的是 Peek
)。如果是这种情况,您将遇到一个无限循环,它会填满所有可用内存并最终耗尽。
编辑:这个答案主要针对您遇到的问题。这对我来说就像家庭作业,所以我不打算重写它,但我建议在@ckuri 对下面这个答案的评论中付费。看起来你做的工作比你应该做的多得多。您可能希望查看迭代堆栈而不是弹出到一个全新的堆栈。
我正在用 C# 开发一个项目,其中一个问题是制作一个接收 Stack 和 returns 新 Stack 的程序,其中包含出现在该堆栈中的数字(每个数字出现的只会在新堆栈中出现一次)。
我编写了这段代码,它工作得很好,但在中间它停止工作并给出了这个错误 "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;
}
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
}
//...
我不熟悉 Stack<T>
上的 Top()
,但从其余代码来看,它似乎不会从堆栈中删除对象(我知道的函数这样做的是 Peek
)。如果是这种情况,您将遇到一个无限循环,它会填满所有可用内存并最终耗尽。
编辑:这个答案主要针对您遇到的问题。这对我来说就像家庭作业,所以我不打算重写它,但我建议在@ckuri 对下面这个答案的评论中付费。看起来你做的工作比你应该做的多得多。您可能希望查看迭代堆栈而不是弹出到一个全新的堆栈。