Java堆栈比较

时间:2013-03-05 17:37:27

标签: java stack

我想知道如何做到这一点:

  1. 比较两个Stack对象
  2. 递归地执行此操作
  3. 之后的方法 这是完整的,Stacks保持原样 (即相同的订单,相同的项目)。
  4. 只有push的{​​{1}},popisEmpty方法可用。

    我正在寻求理论上的帮助,而不是编码帮助,但任何见解都会受到赞赏。

3 个答案:

答案 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中返回并最终推回到堆栈中)会使代码非常光滑,但没有它就很容易。