Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 河内塔-爪哇_Java_Towers Of Hanoi - Fatal编程技术网

Java 河内塔-爪哇

Java 河内塔-爪哇,java,towers-of-hanoi,Java,Towers Of Hanoi,我有一个java版的河内塔程序,我可以让它运行,但我一辈子都不知道如何让它显示它是如何运行的,例如,“磁盘1从TowerA到TowerC”,“磁盘2从TowerA到TowerB”,等等 这是我的密码: 有没有办法将“磁盘#From(TowerA、TowerB或TowerC)添加到(TowerA、TowerB或TowerC)”中?任何帮助都将不胜感激。若要获取堆栈的名称,请在LinkStack类中添加一个getter方法: public String getName() { return th

我有一个java版的河内塔程序,我可以让它运行,但我一辈子都不知道如何让它显示它是如何运行的,例如,“磁盘1从TowerA到TowerC”,“磁盘2从TowerA到TowerB”,等等

这是我的密码:


有没有办法将“磁盘#From(TowerA、TowerB或TowerC)添加到(TowerA、TowerB或TowerC)”中?任何帮助都将不胜感激。

若要获取堆栈的名称,请在
LinkStack
类中添加一个getter方法:

public String getName() {
  return this.name;
}
要创建所需的输出,请在名为
doTowers()的方法中调用
System.out.println(…)
。要获取当前堆栈的名称,可以调用
source.getName()
temp.getName()
dest.getName()

此外,将
peek()
方法添加到
LinkStack
类中也很有用,该类返回内部列表的第一个元素,而不删除它。或者,您可以将
source.pop()
的返回值存储在局部变量中,这样您就可以输出它,然后将其传递给
dest.push()

试试这个

public class TowerApp
{
    static int nDisks = 3;
    static public LinkStack A = new LinkStack("A");
    static public LinkStack B = new LinkStack("B");
    static public LinkStack C = new LinkStack("C");


    static public void doTowers(int nDisks, LinkStack source, LinkStack temp, LinkStack dest)
    {
        if(nDisks <= 4)
            if ((nDisks % 2) == 0)
            {   
                displayStacks(source, temp, dest);
                nDisks = nDisks - 1;
                long dn = source.pop();
                temp.push(dn);
                System.out.println("Disk # "+dn+" moved from Tower "+source.getName() +" to Tower "+temp.getName());
                displayStacks(dest, source, temp);

                dn = source.pop();
                dest.push(dn);
                System.out.println("Disk # "+dn+" moved from Tower "+source.getName() +" to Tower "+dest.getName());

                doTowers(nDisks, temp, source, dest);
            } 
            else
            {
                displayStacks(source, dest, temp);
                nDisks = nDisks - 1;
                long dn =  source.pop();
                dest.push(dn);
                System.out.println("Disk # "+dn+" moved from Tower "+source.getName() +" to Tower "+dest.getName());
                displayStacks(temp, source, dest);
            }

        /*          else if (nDisks >= 5)
        {
            doTowers(nDisks - 2, source, temp, dest);
            temp.push(source.pop());
            doTowers(nDisks - 2, dest, source, temp);
            dest.push(source.pop());
            doTowers(nDisks - 1, temp, source, dest);
        }*/
    }
    static public void displayStacks(LinkStack source, LinkStack temp, LinkStack dest)
    {           
        long n = source.pop();
        temp.push(n);
        System.out.println("Disk #"+n+" moved from Tower "+source.getName() +" to Tower "+temp.getName());
        PrintStacks();
        n = source.pop();
        dest.push(n);
        System.out.println("Disk #"+n+" moved from Tower "+source.getName() +" to Tower "+dest.getName());
        PrintStacks();
        n= temp.pop();
        dest.push(n);
        System.out.println("Disk #"+n+" moved from Tower "+temp.getName() +" to Tower "+dest.getName());
        PrintStacks();
    }

    static public void PrintStacks()
    {
        A.displayStack("TowerA");
        B.displayStack("TowerB");
        C.displayStack("TowerC");
        System.out.println("");
    }

    public static void main(String[] args)
    {
        for (int i = nDisks; i >= 1; i--)
        {
            A.push(i);
        }
        PrintStacks();

        doTowers(nDisks, A, B, C);
    }
}
输出:

TowerA: (top-->bottom): [1, 2, 3]
TowerB: (top-->bottom): []
TowerC: (top-->bottom): []

Disk #1 moved from Tower A to Tower C
TowerA: (top-->bottom): [2, 3]
TowerB: (top-->bottom): []
TowerC: (top-->bottom): [1]

为什么要发布第一位代码和输出的图片?如果有人想复制代码来尝试帮助他们,他们不能。
我可以让它工作
这样你的编译器就不会提到切换的
else
else If
块了?编辑:哦,这只是一个糟糕的代码结构。。。好吧,没关系。我没在想;我一直在做这件事。很抱歉。当您更改顶部NDisk的数量时,会使用else和else if块。
else if
属于第一个if
if(NDisk)
TowerA: (top-->bottom): [1, 2, 3]
TowerB: (top-->bottom): []
TowerC: (top-->bottom): []

Disk #1 moved from Tower A to Tower C
TowerA: (top-->bottom): [2, 3]
TowerB: (top-->bottom): []
TowerC: (top-->bottom): [1]