异常说堆栈是空的,但它不是?

Exception says stack is empty when it is not?

我正在学习书中的一些 advanced collections 等内容,并且遇到了 stacks。我明白了这个概念,但想制作一个快速程序,从 defined point in the stack 然后 places all the values back onto the stack 中删除一个项目。我在这里有我的代码,但我得到类型 System.InvalidOperationException 的异常,堆栈的附加信息为空。我似乎不明白为什么;谁能帮忙?

这是我的代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StackRemover
{
    class Program
    {
        static void Main(string[] args)
        {
            int index = 0; //the index they want to remove
            Stack[] array = new Stack[1]; // will hold the array returned by remove()
            Stack stack = new Stack();

            //fill the stack with values from 0 to 100
            for (int y = 0; y != 100; y++ )
            {
                stack.Push(y);
            }

            //print all items from stack
            foreach (var item in stack) 
            {
                Console.WriteLine(item.ToString());
            }

            Console.WriteLine("\n\nEnter an index to remove: ");
            index = Convert.ToInt32(Console.ReadLine());
            array = remover(stack, index);

            Console.WriteLine("\n\n" + array[1].Pop().ToString() + "\n\n"); //print the value of the removed index

            //print the rest of the values
            foreach(var item in array[0])
            {
                Console.WriteLine(item.ToString());
            }
        }

        public static Stack[] remover(Stack stack, int index)
        {
            Stack holding_stack = new Stack(); // used for holding values temporarily
            Stack value_stack = new Stack();   // will be returned with the desired index only
            int stack_length = stack.Count;
            int target = index - 1; // the index before the one we want to remove
            int current_index = 0;

            //if the index is larger than the stack size
            if(index > stack_length)
            {
                throw new Exception("Index bigger than stack!");
            }

            //pop items from stack and place them onto a temporary stack until we reach target
            while(current_index != target)
            {
                holding_stack.Push(stack.Pop()); //ERROR OCCURS HERE, System.InvalidOperationException, says that the stack is empty?
            }

            value_stack.Push(stack.Pop()); // push the index we were passed onto our third stack

            //place all the values from the holding stack back onto the passed stack
            while(holding_stack.Count != 0)
            {
                stack.Push(holding_stack.Pop());
            }

            return new Stack[]{stack, value_stack};

        }
    }
}

看看你的循环:

while(current_index != target)
{
    holding_stack.Push(stack.Pop());
}

您希望该循环如何结束?您不会在循环体中更改 targetcurrent_index ...也许您打算在循环中增加 current_index ?如果是这样,我可以建议 for 循环比 while 循环更简单吗?

作为旁注,值得遵循 .NET 命名约定 - 其中方法是 PascalCased,变量是 camelCased,没有下划线。

所以你可能会得到:

for (int i = 0; i < target; i++)
{
    holdingStack.Push(stack.Pop());
}

好吧,我在这一节看到了一个问题:

if(index > stack_length)
{
    throw new Exception("Index bigger than stack!");
}

它应该是 index >= stack_length,因为如果您的堆栈中有 100 项并且您尝试获得第 100索引,您将超出范围,因为最后一项将位于索引 99.