2009-01-21 72 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接口的实现)应该工作...

相关问题