You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算整数栈元素平均值并确保输入栈状态不变?

解决栈平均值计算后保持原栈状态的问题

你的代码核心问题在于使用了Pop()方法直接修改原栈,导致原栈元素被移除;同时后续尝试恢复栈的逻辑完全无效——Reverse()是反转栈的元素顺序,而非恢复原状态,且此时栈已被清空,无法起到作用。此外原代码还存在除零错误的风险(栈清空后givenStack.Count为0)。

以下是几种可靠的解决方案:

方法一:直接遍历栈计算(最简单,无修改)

Stack的foreach迭代器会从栈顶到栈底依次读取元素,不会修改原栈结构,直接利用这一点计算平均值即可:

public static double AverageOfStack(Stack<int> givenStack)
{
    if (givenStack.Count == 0)
        return 0; // 处理空栈,避免除零异常

    double sum = 0;
    int elementCount = givenStack.Count;

    foreach (int num in givenStack)
    {
        sum += num;
    }

    return sum / elementCount;
}

这种方式完全不会改变原栈的元素和顺序,是最推荐的方案。

方法二:用临时栈保存元素(适配必须使用Pop的场景)

如果业务场景要求必须通过Pop获取元素,可以用临时栈暂存弹出的元素,计算完成后再恢复原栈:

public static double AverageOfStack(Stack<int> givenStack)
{
    if (givenStack.Count == 0)
        return 0;

    double sum = 0;
    int elementCount = givenStack.Count;
    Stack<int> tempStack = new Stack<int>();

    // 弹出原栈元素,累加并存入临时栈
    while (givenStack.Count > 0)
    {
        int num = givenStack.Pop();
        sum += num;
        tempStack.Push(num);
    }

    // 将临时栈元素推回原栈,恢复原状态
    while (tempStack.Count > 0)
    {
        givenStack.Push(tempStack.Pop());
    }

    return sum / elementCount;
}

临时栈保存了原栈的元素,通过反向弹出推回原栈,完美恢复原栈的元素顺序。

方法三:操作原栈的副本(完全隔离原栈)

创建原栈的副本,对副本进行操作,原栈不受任何影响:

public static double AverageOfStack(Stack<int> givenStack)
{
    if (givenStack.Count == 0)
        return 0;

    // 利用Stack构造函数创建原栈的副本
    Stack<int> stackCopy = new Stack<int>(givenStack);
    double sum = 0;
    int elementCount = stackCopy.Count;

    while (stackCopy.Count > 0)
    {
        sum += stackCopy.Pop();
    }

    return sum / elementCount;
}

副本的结构与原栈完全一致,所有操作都在副本上进行,原栈状态丝毫不改。


内容的提问来源于stack exchange,提问作者Prince Sein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:01:11