Stack 中元素的弹出范围
Pop range of elements in Stack
大家好,我需要一些关于 Stack.Pop() 函数的小帮助。
据我所知,堆栈可以一个接一个地弹出元素,但我需要多个元素才能弹出。例如,我在堆栈中有 5 个元素 (4,3,2,1,0),现在我想弹出前 3 或 2 个元素,直到堆栈索引达到 1 或 2。
到目前为止,我有 "for" 周期无法正常工作:
for(var i = stack.Count - 1; i >= 0; i--)
{
stack.Pop();
}
谁能帮帮我,让他弹出一定范围的元素?
谢谢!
您可以使用简单的 while 循环来执行类似的操作:
var stack = new Stack<int>(new[]{ 4, 3, 2, 1, 0 });
var numberToPop = 3;
while(numberToPop > 0 && stack.Count > 0)
{
numberToPop--;
stack.Pop();
}
如果你想弹出直到堆栈达到一定大小,只需使用
while(stack.Count > desiredCount)
stack.Pop();
如果你想弹出一定数量的项目,那么只需使用
for(int i=0; i < numberOfItemsToPop && stack.Count > 0; i++)
stack.Pop();
您还可以创建一个扩展方法:
public static class Extensions
{
public static List<T> PopRange<T>(this Stack<T> stack, int amount)
{
var result = new List<T>(amount);
while (amount-- > 0 && stack.Count > 0)
{
result.Add(stack.Pop());
}
return result;
}
}
并在您需要的地方使用它:
var stack = new Stack<int>(new[] { 1, 2, 3, 4, 5 });
var result = stack.PopRange(3);
// result: { 5, 4, 3 }
// stack: { 2, 1}
您可以使用 TryPopRange
的 ConcurrentStack
class。
示例:
var stack = new ConcurrentStack<int>(new[] { 1, 2, 3, 4, 5 });
var resultPop = new int[2]; //Assume that we want to pop only 2 items.
int startIndex = 0;
int endIndex = 1;
// The TryPopRange will pop 2 items from stack into resultPop.
if (stack.TryPopRange(resultPop, startIndex, endIndex) >= 1) //It returns the number of popped item.
{
Console.WriteLine($"This items has been popped: {string.Join(",", resultPop)}");
}
大家好,我需要一些关于 Stack.Pop() 函数的小帮助。 据我所知,堆栈可以一个接一个地弹出元素,但我需要多个元素才能弹出。例如,我在堆栈中有 5 个元素 (4,3,2,1,0),现在我想弹出前 3 或 2 个元素,直到堆栈索引达到 1 或 2。 到目前为止,我有 "for" 周期无法正常工作:
for(var i = stack.Count - 1; i >= 0; i--)
{
stack.Pop();
}
谁能帮帮我,让他弹出一定范围的元素? 谢谢!
您可以使用简单的 while 循环来执行类似的操作:
var stack = new Stack<int>(new[]{ 4, 3, 2, 1, 0 });
var numberToPop = 3;
while(numberToPop > 0 && stack.Count > 0)
{
numberToPop--;
stack.Pop();
}
如果你想弹出直到堆栈达到一定大小,只需使用
while(stack.Count > desiredCount)
stack.Pop();
如果你想弹出一定数量的项目,那么只需使用
for(int i=0; i < numberOfItemsToPop && stack.Count > 0; i++)
stack.Pop();
您还可以创建一个扩展方法:
public static class Extensions
{
public static List<T> PopRange<T>(this Stack<T> stack, int amount)
{
var result = new List<T>(amount);
while (amount-- > 0 && stack.Count > 0)
{
result.Add(stack.Pop());
}
return result;
}
}
并在您需要的地方使用它:
var stack = new Stack<int>(new[] { 1, 2, 3, 4, 5 });
var result = stack.PopRange(3);
// result: { 5, 4, 3 }
// stack: { 2, 1}
您可以使用 TryPopRange
的 ConcurrentStack
class。
示例:
var stack = new ConcurrentStack<int>(new[] { 1, 2, 3, 4, 5 });
var resultPop = new int[2]; //Assume that we want to pop only 2 items.
int startIndex = 0;
int endIndex = 1;
// The TryPopRange will pop 2 items from stack into resultPop.
if (stack.TryPopRange(resultPop, startIndex, endIndex) >= 1) //It returns the number of popped item.
{
Console.WriteLine($"This items has been popped: {string.Join(",", resultPop)}");
}