如何计算整数栈元素平均值并确保输入栈状态不变?
解决栈平均值计算后保持原栈状态的问题
你的代码核心问题在于使用了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
相关产品推荐
相关产品推荐

