【发布时间】: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