Размер стека Java не возвращает количество элементов в стеке

#java #data-structures #stack #size

#java #структуры данных #стек #размер

Вопрос:

Я новичок в структурах данных и программировании в целом, и я изучаю концепцию стека, реализуя реверсор строк. Поскольку я хотел использовать размер стека в качестве счетчика для отображения всех элементов в стеке, я заметил, что размер стека не возвращает количество элементов в стеке. Пример:

     public String reverse(String string) {
    StringBuffer stringBuffer = new StringBuffer();
    //Use a stack to reverse this string.As a stack is a LIFO collection, it goes by last in first out.
   
    Stack<Character> characters = new Stack<>();
    char[] characterArray = string.toCharArray();
    for(char ch : characterArray) {
        characters.push(ch);
    }
    for(int i=0; i < characterArray.length; i  ) {
        stringBuffer.append(characters.pop());
    }
    return stringBuffer.toString();
  

}
  

ввод «helloworldz» возвращает «zdlrowolleh», как и ожидалось. Но при использовании размера стека в качестве счетчика….

     public String reverse(String string) {
    StringBuffer stringBuffer = new StringBuffer();
    Stack<Character> characters = new Stack<>();
    char[] characterArray = string.toCharArray();
    for(char ch : characterArray) {
        characters.push(ch);
    }
    for(int i=0; i < characters.size(); i  ) {
        stringBuffer.append(characters.pop());
    }
    return stringBuffer.toString();

}
  

он возвращает «zdlrow»,

это означает, что размер стека не возвращает количество элементов в стеке. Я пропустил что-то важное? любая помощь будет оценена.

Ответ №1:

Размер стека уменьшается 1 с каждой pop операцией над ним и, следовательно, в следующем блоке кода,

 for(int i=0; i < characters.size(); i  ) {
    stringBuffer.append(characters.pop());
}
  

цикл будет выполняться только половину числа раз по сравнению со следующим блоком кода

 for(int i=0; i < characterArray.length; i  ) {
    stringBuffer.append(characters.pop());
}
  

Ответ №2:

Если вы хотите выполнить цикл, зависящий от информации из самого characters стека, правильным выбором будет:

     while (!characters.isEmpty()) {
        stringBuffer.append(characters.pop());
    }