【问题标题】:How do I move elements between stacks in recursion?如何在递归堆栈之间移动元素?
【发布时间】:2019-04-04 16:05:48
【问题描述】:

我有河内塔问题。我有三个堆栈,我想使用称为 move() 的方法以递归方式以特定顺序移动元素。我应该在另一个从堆栈中添加和删除元素的类中使用方法 pop() 和 push()。

我曾尝试实现此方法,但它仅适用于第一个基本情况,例如。如果 n==1。

 public static void move(SpecialStack from, 
                         SpecialStack to, 
                         SpecialStack help, 
                         int n) {
   if (n == 1) {
 to.push(from.pop());
 }
   else {
     move(from, to, help, n-1);
     to.push(from.pop());
     move(help, to, from, n-1);
   }
 }

 public static void main(String[] args) {
    int size = 3;
    SpecialStack from = new SpecialStack(size);
    SpecialStack to = new SpecialStack();
    SpecialStack help = new SpecialStack();
    System.out.println("Start state");
    System.out.println("   From: " + from);
    System.out.println("   To:   " + to);
    System.out.println("   Help: " + help);
    move(from, to, help, size);
    System.out.println("End state");
    System.out.println("   From: " + from);
    System.out.println("   To:   " + to);
    System.out.println("   Help: " + help);

我从 push() 方法中得到的错误是我自己的“数字太高!”来自其他类 SpecialStack:


 import java.util.*;
import java.util.ArrayList;

public class SpecialStack {

  private ArrayList<Integer> specStack;

  public SpecialStack() {
    specStack = new ArrayList<Integer>();
  }

  public SpecialStack(int n) {         
    this.specStack = new ArrayList<Integer>(n);
      int i;
      for (i=0; i<n; i++) {
        specStack.add(i, n-i);
      }
    }


  public void push(int x) { 
    if (specStack.size() == 0) { 
      specStack.add(x);
    }
    else if (x > specStack.get(specStack.size() -1)) {
      throw new RuntimeException("Number too high");
    }
    else {
      specStack.add(x); 
    }
  }

  public int pop() { 
    if (specStack.size() == 0) {
      throw new RuntimeException("Empty stack");
    }
    else {
      int length = specStack.size() -1;
      int topNumber = specStack.get(length); 
      specStack.remove(length);
      return topNumber;
    }
  }

  public String toString() {
    String arrList = "[";
    int i;
    for (i = 0; i < specStack.size(); i++) { 
      if (i == specStack.size() -1) {
        arrList = arrList + specStack.get(i);
      } 
      else {
        arrList = arrList + specStack.get(i) + ",";}
    }
  arrList = arrList + "]";
  return arrList;
  }
}

我不明白为什么会出现此错误。而且, move() 方法是否正确?感谢您的建议!

【问题讨论】:

  • 什么是SpecialStack?我们可以看到代码吗?
  • 这是pop和push方法的类。我添加了代码
  • 移动从不会创建一个无序的堆栈吗?也就是说,“数字太高”的条件是否适用于 所有 动作?

标签: java recursion arraylist towers-of-hanoi


【解决方案1】:

您的代码中有一个愚蠢的错误。在你的else部分,当n &gt; 1时,你应该这样做

move(from, help, to, n-1);

而不是

move(from, to, help, n-1);

请记住,对于任何大于 1 的值,您都将“帮助”队列视为除一个钉子之外的所有目标(到)队列。完成后,您将最低挂钩移动到原始“to”队列,并重复这些移动,将原始“help”视为“from”,将原始“from”视为“help”。希望有帮助。

【讨论】:

  • 哇。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2020-08-03
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2020-06-04
相关资源
最近更新 更多