2015-10-15 2 views
0

Когда я пытаюсь проверить это; например, если я нажимаю 4 элемента, а затем создаю цикл for:Действительно ли мой метод Pop или Push в моем классе Stack написан неправильно?

for(int i=0; i<=stack.size(); i++){ 
System.out.println(stack.pop()); 
} 

Он не выводит последний элемент. Это проблема с моим методом pop?

public void push(E element){ 
    top= new Node<E>(element,top); 
    size++; 

} 

public E pop(){ 
    E popped; 
    if(this.isEmpty()){ 
     throw new EmptyStackException(); 
    } 
    popped=top.data; 
    this.setTop(top.next); 
    size--; 
    return popped; 
    } 
+2

Я думаю, вам нужно показать весь класс. Использование '<=', а не '<' должно вызывать исключение. –

+1

Сколько элементов вы ожидаете напечатать? BTW, вы повторяете 'stack.size() + 1 раз ... –

+0

пожалуйста, более понятный код более –

ответ

3

Проблема в том, что вы перебираете свой стек с размером.

Просто посмотреть, что происходит в вашей цикл:

  1. я = 0; размер = 4; i < = size == true
  2. i = 1; размер = 3; i < = size == true
  3. i = 2; размер = 2; i < = size == true
  4. i = 3; size = 1; i < = size == false

Таким образом, вы не выставляете последний элемент.

Но вместо того, чтобы использовать для цикла с размером как предел вы должны реализовать hasNext() метод, который возвращает истину, если стек имеет следующий элемент:

while(stack.hasNext()) 
{ 
    Element e = stack.pop(); 
    // Do stuff... 
} 

Или pop() возвращает нуль, если больше элементов не являются в стеке, и вы цикл через него, как это:

Element e; 
while((e = stack.pop()) != null) 
{ 
    // Do stuff... 
} 
+0

Я бы, как бы то ни было, преходящую мысль, вы должны сделать .size() + 1; –

+0

Это было бы еще более неправильно на стольких уровнях, что я не могу написать их в форме комментариев. Кроме того, это не решит проблему вообще, так как она будет равна 0,5 (true) -> 1,4 (true) -> 2,3 (true) -> 3,2 (false, останов цикла). Таким образом, вы по-прежнему будете добавлять только 3 элемента. Проблема здесь в том, что размер стека уменьшается, а вы его зацикливаете. –

0

Если вы используете .pop() размера вашей переменной GET в 1 меньше, так что wwould будет лучше, если вы оставите из инкремента в конце хода цикла:

for(int i=0; i<=stack.size();){ 
    System.out.println(stack.pop()); 
}