2010-06-15 4 views
3

В настоящее время единственный стек, о котором я ничего знаю, это Vector, я обычно использую это вместо массива, но я понимаю, что существуют другие типы стеков, и все они подходят для разных заданий.Java и различные типы стеков

Проект, над которым я сейчас работаю, требует, чтобы я вставлял объекты в определенную позицию внутри стека, а не всегда перед стекей, и у меня создается впечатление, что вектор не может быть лучшим классом для этой работы ,

Может ли кто-нибудь, пожалуйста, дать мне краткое описание других типов стеков, доступных мне с языком Java и их преимуществами и недостатками? Являются ли эти названия однородными? Например. Используются ли они только на языке Java или используются в качестве общих терминов в области компьютерных наук?

Спасибо

ответ

1

Я предлагаю взглянуть на this tutorial on the Java Collections Framework, который относится ко всем основным типам данных в java.util пакете, который вы могли бы использовать для таких вещей (списки, векторы, карты, деревья и т.д.).

3

Вы упомянули, что вставляете вещи в середину своего «стека». Тогда я бы рекомендовал использовать LinkedList.

Если вы уже нашли позицию, необходимую для ввода нового элемента, время для ее вставки - O(1). Для вектора это O(n), потому что вам нужно скопировать массив подложки.

LinkedList также поддерживает операции, подобные стеку, такие как добавление на конец или выпадение конца стека.

Посмотрите на javadocs, чтобы использовать структуру данных, чтобы посмотреть, что она предлагает.

Чтобы ответить на ваш последний вопрос. LinkedList - очень распространенная структура данных в компьютерной науке. Он также очень часто используется для реализации стеков, потому что операции push и pop являются постоянным временем, O(1).

+0

Связанный список - это неэффективная структура данных, неэффективная для памяти, и зачастую не лучшая реализация стека; массивные списки обеспечивают амортизацию O (1) push и pop. –

+0

@ Майкл, но вставка в любую структуру с поддержкой массива имеет плохую (O (n)) производительность независимо от того, что. – jjnguy

+0

@jinguy: true, но они предлагают O (1) произвольный доступ. Если вам нужны оба (как правило, это так), то они отменяют друг друга, а эффективность памяти делает реализацию на основе массива лучшим выбором. Только если вам часто нужно добавлять/удалять во время итерации и не нужен произвольный доступ, это связанный список - хороший выбор. –

1

Документация API из java.util.Stack советует вам использовать одну из реализаций интерфейса java.util.Deque, например java.util.ArrayDeque или java.util.LinkedList.

A LinkedList эффективен для вставки элементов посередине и удаления элемента из головы или хвоста (но он неэффективен для поиска случайного элемента).

3
  • стек является абстрактным типом данных характеризуется поведением LIFO или толчке/поп операций
  • список является абстрактным типом данных характеризуется тем, что его elemets доступны через числовой индекс.
  • массив является реализация низкого уровня списка
  • java.util.List является тип списка представлена ​​в виде интерфейса Java
  • java.util.Deque является интерфейсом Java, что обеспечивает как LIFO и поведение очереди FIFO (и, таким образом, поведение стека в качестве подмножества)
  • java.util.Vector - это устаревшая реализация списка (на основе массива с автоматическим изменением размера), который больше не должен использоваться
  • java.util.ArrayList является модернизированной заменой
  • java.util.Stack является устаревшей реализацией стеки, который состоит из добавления некоторых стеков подобных методов к вектору, который не является хорошим способом сделать это.
  • java.util.ArrayDeque современной реализация интерфейса Deque
  • java.util.LinkedList это другая реализация списка (который также реализует интерфейс Deque), который имеет ряд больших недостатков и должен использоваться только в очень конкретном (лучше, когда вам нужно вставлять или удалять элементы в списке очень часто).

В принципе, если вы хотите стек, использовать интерфейс Deque и ArrayDeque как класс реализации (за исключением редких случаев, когда LinkedList лучше). Если вы хотите получить список, используйте ArrayList

+0

он указывает, что он будет делать вставки в середину «стека» часто. – jjnguy

+1

Я не думаю, что «Стек» - это структура данных, которая на самом деле необходима. (Стеки, в чистом смысле, разрешают доступ только к элементу, который был добавлен последним) – jjnguy

+0

Обратите внимание, что вектор и стек устарели, потому что все операции синхронизированы. Новые версии не синхронизированы, и пользователю необходимо синхронизировать по необходимости или обернуть список с помощью синхронизированного класса-оболочки (см. Java.util.Collections.synchronizedList()). – AngerClown

Смежные вопросы