2014-11-27 2 views
0

Я начинаю программировать. В основном я пытаюсь реализовать Башню Ханоя, используя стеки. Я ссылался на . Разбивка кода Интервью решений и, похоже, имеет пустую ошибку исключения стека. Я повторно написал часть рекурсии, но все еще получаю эту ошибку. Почему я получаю эту ошибку?tower of hanoi using stack - Empty Stack Exception

import java.util.*; 

public class Tower { 

    private Stack<Integer> disks; 
    private int index; 
    public Tower(int i) { 
     disks = new Stack<Integer>(); 
     index = i; 
    } 

    public int index() { 
     return index; 
    } 

    public void add(int d) { 
     if(!disks.isEmpty() && disks.peek() <= d) { 
      System.out.println("Error placing disk: " + d); 
     } 
     else { 
      disks.push(d); 
     } 
    } 

    public void moveTopTo(Tower t) { 
     int top = disks.pop(); 
     t.add(top); 
     System.out.println("Move disk " + top 
          + " from " + index() + " to " + t.index()); 
    } 

    public void moveDisks(int n, Tower origin, Tower buffer, Tower destination) { 
     if(n == 1) { 
      moveTopTo(destination); 
     } 
     else if(n > 0) { 
      moveDisks(n - 1, origin, destination, buffer); 
      moveTopTo(destination); 
      moveDisks(n - 1, buffer, origin, buffer); 
     } 
    } 

    public static void main(String[] args) { 
     int n = 3; 
     Tower[] towers = new Tower[n]; 
     for(int i = 0; i < 3; i++) { 
      towers[i] = new Tower(i); 
     } 
     for(int i = n - 1; i >= 0; i--) { 
      towers[0].add(i); 
     } 
     towers[0].moveDisks(n, towers[0], towers[1], towers[2]); 
    } 
} 
+0

Вы отлаживали код? в какой строке вы получаете ошибку? вы можете добавить stacktrace? –

+0

Спасибо, Хорди! Вот они .. Это первый раз, когда я задаю вопрос .. очень запутался в отступе и форматировании. Извините, если это слишком трудно читать –

+0

Добавление StackTrace и ошибок: Переместить диск 0 от 0 до 2 Переместить диск 1 от 0 до 1 Ошибка размещения на диске: 2 Переместить диск 2 от 0 до 2 Исключение в потоке «Основной "java.util.EmptyStackException \t на java.util.Stack.peek (Stack.java:102) \t в java.util.Stack.pop (Stack.java:84) \t в Tower.moveTopTo (Tower.java : 26) \t at Tower.moveDisks (Tower.java:46) \t at Tower.main (Tower.java:60) –

ответ

1

Похоже, вы лечения moveDisks(), как если бы это были статичными: он принимает три параметра башни. Другими словами, это не действительно метод экземпляра конкретной башни.

Но проблема в том, что внутри этого кода вы вызываете .moveToTop(), и это, безусловно, метод экземпляра: он перемещает диск из этой конкретной башни.

В первой попытке к решению, я бы попытаться вернуться к книжному решению, но изменить его просто немного:

public void moveDisks(int n, Tower destination, Tower buffer) { 
    if(n > 0) { 
     moveDisks(n - 1, buffer, destination); 
     moveTopTo(destination); 
     buffer.moveDisks(n - 1, destination, this); 
    } 
} 

Последней строкой является ключевой. Мы говорим:

  1. Переместите n-1 диски с этой башни в буфер, используя пункт назначения в качестве буфера.
  2. Переместите верхний диск с этой башни в пункт назначения.
  3. (Ключ) перемещать n-1 диски из буфера в пункт назначения, используя эту башню в качестве буфера.

Альтернатива, чтобы получить ваш подход работает. Если вы хотите это сделать, начните с объявления .moveDisks()static. Как только вы это сделаете, компилятор будет жаловаться на вызов .moveToTop(), который также должен быть сделан статическим. И когда вы тоже станете этим статиком, вы обнаружите, что вам нужно передать ему две башни: источник и пункт назначения.


В настоящий момент у вас есть смесь двух подходов, поэтому это происходит неправильно.

+1

Спасибо, что нашли время ответить на мой вопрос. Вы на 100% прав: когда я сталкиваюсь с ошибкой, используя исходный код из книги (я имею в виду, что я случайно опустил «буфер».), Я попытался повторно использовать статическую версию TOH, которую я написал раньше, и, очевидно, это испортило ситуацию , –