这些堆栈需要合并吗?

时间:2012-02-13 10:59:21

标签: c# requirements

作为考试98-361软件开发基础知识的一部分进行的熟练度评估中,出现了这个问题:

  

场景3-3:使用堆栈

     

您正在编写一个使用两个堆栈的程序。每个堆栈中的数据已按降序排列。您需要处理两个堆栈的内容,使输出按屏幕升序打印。你会怎么写这样的节目?

现在,我已经编码了这个场景。我的解决方案是迭代两个单独的堆栈,通过弹出它们的项目将它们合并到一个List中,直到堆栈为空,并将列表排序为正确的顺序。

然而,令我感到震惊的是,我是否应该合并堆栈这个问题有点模糊。这是暗示的,但它的不是。

如果您正在阅读此问题,您会如何解读?

请注意,我实际上并没有参加此考试,只是准备考试。在我看来,这更像是一个需求解释问题。

3 个答案:

答案 0 :(得分:3)

我的观点:

DECLARE NEW_LIST;
INT COUNT = STACK_A.COUNT() + STACK_B.COUNT()

FOR I=0 TO COUNT-1
    IF STACK_A.PEEK() > STACK_B.PEEK()
       NEW_LIST.ADD(STACK_A.POP())
    ELSE
       NEW_LIST.ADD(STACK_B.POP());

现在您排序了NEW_LIST - 您只需要决定打印顺序 (按升序换算)

假设m, n是两个堆栈的初始大小,

合并两个堆栈然后对列表进行排序将花费更多 -

O((n+m)log(n+m)) 快速排序,明显慢于

O(m+n) - 针对上述解决方案

答案 1 :(得分:1)

我认为你是对的。这是我最初的解释(虽然我同意它似乎有点模糊)。并且进一步考虑,在我看来,除非它们应该被合并,否则没有必要指定两个堆栈。

答案 2 :(得分:0)

这个问题听起来像是一个合并排序的设置;要以组合的,排序的(但颠倒的)顺序获取两者的内容,您反复查看每个堆栈的顶部以查看哪个值较低(id est,较早的降序排序),弹出该堆栈的值并且把它推到第三个堆栈。重复直到两个源堆栈都为空,并且因为您的第三个堆栈是FILO,所以按降序添加的项目将按升序弹出。