堆栈集合和循环

时间:2015-03-24 23:07:25

标签: c# loops collections stack

我似乎无法找到我的代码的问题。可能是因为我太累了,但这让我疯了。

while循环工作并遍历整个集合并执行它必须执行的操作。 foreach循环也是如此,尽管我不确定创建列表的副本是否值得考虑。

for循环似乎是我继续前进的最佳选择,并在迭代它时更改集合的值。

问题是它总是太少于集合中的所有条目。 meal.count将在for循环结束时返回1。我做错了什么?

namespace HFCSExercise_Lumberjack
{
    class Lumberjack
    {
        public string Name { get; private set; }
        private Stack<Flapjack> meal;

        public Lumberjack(string name)
        {
            Name = name;
            meal = new Stack<Flapjack>();
        }

        public int FlapjackCount
        {
            get
            {
                return meal.Count;
            }
        }

        public void TakeFlapjacks(Flapjack food, int howMany)
        {
            for(int i = 0; i < howMany; i++)
            {
                meal.Push(food);
            }
        }

        public void EatFlapjacks()
        {
            //while(meal.Count > 0)
            //{
            //    Console.WriteLine("Ed ate a {0} flapjack", meal.Pop().ToString().ToLower());
            //}

            for (int i = 0; i <= meal.Count; i++)
            {
                Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
            }

            //foreach (Flapjack x in meal.ToList())
            //{
            //    Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
            //}
        }
    }
}

1 个答案:

答案 0 :(得分:2)

正如评论中所述,您的逻辑问题是每次使用meal.Countmeal.Pop()的值都会发生变化。请记住,pop正在从堆栈中删除一个项目。

for (int i = 0; i <= meal.Count; i++)
            {
                Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
            }

因此,通过上面的循环,当你到达集合的中间(假装长度最初为10)时,你已经弹出了5个项目,长度现在是5,你从循环中断开而没有弹出另一个堆栈的一半。

这里更直观的构造是使用一段时间;

while (meal.Count > 0)
{
     Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
}
Console.WriteLine("Now there are {0} items left!", meal.Count);

这将迭代整个堆栈,弹出每个项目并打印它。正如您所看到的,我添加的print语句将证明您已将所有项目弹出堆栈。