2015-03-24 65 views
0

我似乎无法找到与我的代码的问题。可能是因为我太累了,但这使我疯狂。堆栈集合和循环

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

对于循环来说,A循环似乎是我继续前进的最佳选择,并在迭代时改变集合的值。

问题是,它总是会出现一个太短的集合中的所有条目。在循环结束时,meal.count将返回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

'Pop'修改堆栈的大小,使'meal.Count'减少,而'i'增加。如果你想像这样使用'for',你应该在迭代之前存储初始计数。尽管如此,我会使用'while(meal.Count> 0){..。}“。 – Lee 2015-03-24 23:14:57

+0

您的for循环将无法按预期工作,因为'meal.Count'不是静态的 - 它会随着每个'Pop'操作而减少 – BrokenGlass 2015-03-24 23:15:05

+0

这可以通过简单地通过for循环进行调试,同时观察meal.Count。 – 2015-03-24 23:20:49

回答

2

正如评论所说,用你的逻辑问题是,meal.Count值每次使用meal.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); 

这将遍历整个堆栈,弹出每个项目并打印它。正如你可以看到我添加的打印语句将证明你已经弹出了每个项目。