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

Sic*_*ius 0 .net c# stack

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};

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

看看你的循环:

while(current_index != target)
{
    holding_stack.Push(stack.Pop());
}
Run Code Online (Sandbox Code Playgroud)

你怎么期望这个循环永远完成?你不要改变循环体中的任何一个target或者current_index在循环体中...也许你想要current_index在循环中增加?如果是这样,我可以建议for循环比while循环更简单吗?

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

所以你最终会得到:

for (int i = 0; i < target; i++)
{
    holdingStack.Push(stack.Pop());
}
Run Code Online (Sandbox Code Playgroud)