我想知道如何做到这一点:
只有push
的{{1}},pop
和isEmpty
方法可用。
我正在寻求理论上的帮助,而不是编码帮助,但任何见解都会受到赞赏。
答案 0 :(得分:6)
如果两个堆栈的顶层元素相同,则它们是相同的,其余堆栈是相同的(即递归条件)。
现在,想一想在从方法调用返回之前要做什么,以便使堆栈与调用时给定的方式相同。
--- --- EDIT
工作的Java代码(源自 Markus A. 解决方案,但有趣地使用了“finally”和泛型):
static <T> boolean compareStacks(Stack<T> a, Stack<T> b) {
if (a.isEmpty() != b.isEmpty()) return false;
if (a.isEmpty() && b.isEmpty()) return true;
T element_a = a.pop();
T element_b = b.pop();
try {
if (((element_a==null) && (element_b!=null)) || (!element_a.equals(element_b)))
return false;
return compareStacks(a, b);
} finally { // restore elements
a.push(element_a);
b.push(element_b);
}
}
答案 1 :(得分:4)
在伪代码中,您可以执行以下操作:
boolean compareStacks(a, b) {
if (a.isEmpty() != b.isEmpty()) return false; // check if one is empty
if (a.isEmpty() && b.isEmpty()) return true; // check if both are empty
element_a = a.pop(); // grab elements and compare them
element_b = b.pop();
if (((element_a==null) && (element_b!=null)) || !element_a.equals(element_b)) {
a.push(element_a); // if they are not equal, restore them and return false
b.push(element_b);
return false;
}
result = compareStacks(a, b); // compare shortened stacks recursively
a.push(element_a); // restore elements
b.push(element_b);
return result; // return result from recursive call
}
答案 2 :(得分:0)
通过递归,将其视为2部分,“设置”和递归函数总是有帮助的。您的设置将创建正确的情况(创建两个堆栈,传入它们等)然后调用递归方法,并在递归方法完成后,报告结果。
在你的情况下,你可能想要“递归”方法的这个签名:
public boolean compareStacks(Stack one, Stack two)
如果该方法弹出&amp;比较堆栈的顶部两个元素,然后它可以返回false(说它们不比较)。如果他们这样做,你现在有两个堆栈,每个堆栈比以前更短。你已经知道如何比较这两个堆栈了(你刚刚写了这个方法!)。
最后,您可以将一个元素“推”回每个堆栈,以便在返回之前恢复之前的状态。
在不进行比较的情况下恢复堆栈会有一点小问题,并确保如果你调用的compareStack失败,它会正确地将其传递到之前的状态,即使“当前”compareStack成功,但这些都是实施细节 - 只是想我会提到那些,所以你不要忽视它们。
有一个可爱的解决方案,Try / finally(没有捕获,从try中返回并最终推回到堆栈中)会使代码非常光滑,但没有它就很容易。