2015-03-24 63 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); 

這將遍歷整個堆棧,彈出每個項目並打印它。正如你可以看到我添加的打印語句將證明你已經彈出了每個項目。