作为考试98-361软件开发基础知识的一部分进行的熟练度评估中,出现了这个问题:
场景3-3:使用堆栈
您正在编写一个使用两个堆栈的程序。每个堆栈中的数据已按降序排列。您需要处理两个堆栈的内容,使输出按屏幕升序打印。你会怎么写这样的节目?
现在,我已经编码了这个场景。我的解决方案是迭代两个单独的堆栈,通过弹出它们的项目将它们合并到一个List中,直到堆栈为空,并将列表排序为正确的顺序。
然而,令我感到震惊的是,我是否应该合并堆栈这个问题有点模糊。这是暗示的种,但它的种不是。
如果您正在阅读此问题,您会如何解读?
请注意,我实际上并没有参加此考试,只是准备考试。在我看来,这更像是一个需求解释问题。
答案 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,所以按降序添加的项目将按升序弹出。