← Назад к вопросам

Какие знаешь главные функции Stack?

1.0 Junior🔥 141 комментариев
#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные функции класса Stack в Android/Java

Stack (стек) — это классическая структура данных, работающая по принципу LIFO (Last In, First Out — «последним пришел, первым вышел»). В Android/Java класс Stack является подклассом Vector и предоставляет стандартные операции для работы со стеком. Вот ключевые функции:

1. push(E item) — Добавление элемента

Помещает элемент на вершину стека.

Stack<String> stack = new Stack<>();
stack.push("Первый");
stack.push("Второй"); // Теперь "Второй" на вершине

2. pop() — Извлечение элемента

Удаляет и возвращает элемент с вершины стека. Если стек пуст, выбрасывает EmptyStackException.

String top = stack.pop(); // Вернет "Второй" и удалит его

3. peek() — Просмотр вершины

Возвращает элемент с вершины стека без его удаления. Также может выбросить EmptyStackException.

String topWithoutRemoval = stack.peek(); // Вернет "Первый", стек останется неизменным

4. empty() (или isEmpty() от Vector) — Проверка на пустоту

Проверяет, пуст ли стек.

boolean isEmpty = stack.empty(); // Вернет false, если есть элементы

5. search(Object o) — Поиск элемента

Возвращает позицию элемента от вершины стека (1-based). Если элемент не найден, возвращает -1.

Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);
int position = stack.search(20); // Вернет 2 (30 — позиция 1, 20 — позиция 2)

Важные особенности и современные альтернативы

Хотя Stack все еще используется, в современной разработке на Android/Java часто предпочитают более производительные и гибкие альтернативы:

  • Использование ArrayDeque: Класс ArrayDeque реализует интерфейс Deque и рекомендуется Oracle как более предпочтительная замена Stack, поскольку он не синхронизирован по умолчанию (что дает лучшую производительность) и предоставляет более чистый API.

    Deque<String> deque = new ArrayDeque<>();
    deque.push("Элемент"); // аналог push
    String top = deque.pop(); // аналог pop
    
  • Синхронизация: Stack является потокобезопасным (так как наследует от Vector), но это часто приводит к излишним накладным расходам, если синхронизация не требуется.

  • Наследование от Vector: Из-за этого Stack наследует все методы Vector (например, add(index, element), get(index)), что нарушает чистоту концепции стека и позволяет модифицировать его в произвольных позициях, что нежелательно.

Пример полного цикла работы со Stack

Stack<String> browserHistory = new Stack<>();

// Добавляем посещенные страницы
browserHistory.push("google.com");
browserHistory.push("stackoverflow.com");
browserHistory.push("github.com");

// Смотрим текущую страницу без удаления
String currentPage = browserHistory.peek(); // "github.com"

// Возвращаемся назад
String previousPage = browserHistory.pop(); // Удаляем "github.com", возвращаем его

// Проверяем, осталась ли история
if (!browserHistory.empty()) {
    System.out.println("В истории осталось: " + browserHistory.size() + " страниц");
}

// Ищем конкретную страницу
int pos = browserHistory.search("google.com"); // Вернет 2 (stackoverflow.com — 1, google.com — 2)

Вывод: Основные функции Stackpush, pop, peek, empty и search — покрывают базовые потребности работы со стеком. Однако в новых проектах стоит рассмотреть ArrayDeque как более современную и производительную альтернативу, особенно в однопоточных сценариях.

Какие знаешь главные функции Stack? | PrepBro