Stack中的流行元素范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(stack.Count > desiredCount)
    stack.Pop();

如果你想弹出一定数量的物品,那么就使用吧

for(int i=0; i < numberOfItemsToPop && stack.Count > 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();
}
另一答案

您还可以创建扩展方法:

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

例:

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中的流行元素范围的主要内容,如果未能解决你的问题,请参考以下文章

即学即用的 30 段 Python 实用代码

如何访问 MainActivity() 中的片段元素?

如何在 SwiftUI 中正确排列 Stack 中的元素

炫酷 CSS 背景效果的 10 个代码片段

《剑指offer》之用两个栈实现队列

如何从 Android 中的 Fragment 访问 UI 元素?