2009-01-21 109 views
3

對於編程課程,我爲第一個家庭作業創建一個二十一點程序。教授給了我們一個樣本卡類,其中包括將它們添加到卡組的方法。對於她的套牌,她使用ArrayList,您可以使用Collections.shuffle()方法輕鬆地將Knuth Shuffle。有沒有辦法將Knuth shuffle應用於Stack數據結構?

雖然(很明顯)這個方法並不適用於堆棧,但我認爲堆棧結構對於這個程序來說效果最好,因爲你可以彈出並推送卡片進出卡片。

回答

0

棧結構不應該是隨機訪問(java.util.Stack沒有理由,儘管它有自己的問題)。除此之外,您可以將堆棧的元素彈出到ArrayList中,隨機播放,然後將它們推回到您的堆棧中。

2

我想在ArrayList上做棧操作要容易得多。

0

不,Fisher-Yates shuffle依賴隨機訪問數據集。你需要一些允許get(int index)的Collection。如果你需要一個堆棧,只需使用一個列表。 push和pop只需調用get(0)並添加(0)。這比實現一些自定義堆棧類更好。使用你所擁有的,不要發明新的課程。

1

堆棧是一個列表,所以你可以在你的堆棧上調用Collections.shuffle()。

這就是說,Stack是一個老的類,就像Vector和一種過時的類。現在你可以使用Dequeue(一個作爲隊列或堆棧的雙端隊列),而不是堆棧,但是,出隊不是列表,所以它們不能被混洗。

此外,您還可以隨時把你的卡在一個列表,隨機播放它們,然後所有的人都加入到一個出列

+0

是如何「堆棧」已經過時了嗎?它們是基本的數據結構之一。你編寫的每個程序都使用堆棧 – mmcdole 2009-01-21 22:31:37

0

亞當的回答是最好的一個堆棧。對於紙牌遊戲,我通常使用的是簡單的數組列表並刪除隨機元素。不需要洗牌。

0

只是在你將卡放入堆棧之前洗牌。 由於正確實施的Knuth shuffle不允許在已經遍歷的甲板部分中更換卡片,因此您可以隨意將它們放到堆棧上...

由於java不會讓您將堆棧視爲一個隨機訪問列表只是從堆棧複製到一個ArrayList來完成混洗階段(額外的52個元素ArrayList敲響並不是什麼大問題)

0

Collections.shuffle()方法爲你做了這些,你不必明確地。

「如果指定的列表沒有實現RandomAccess接口並且很大,那麼shuffle()的這個實現會在指定的列表洗牌之前將其轉儲到一個數組中,並將洗過的數組轉儲回列表中。行爲可能會因洗牌「順序訪問」列表而導致。「

這就是Java文檔說,大約Collections.shuffle()方法執行 因此傳遞java.util.Stack中(的java.util.List接口的實現)應該工作...

相關問題