#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());
}