Dlaczego warto używać Deque over Stack?

Potrzebuję Stack struktury danych do mojego przypadku użycia. Powinienem być w stanie wcisnąć elementy do struktury danych i chcę tylko pobrać ostatni element ze stosu . The JavaDoc for Stack says:

Bardziej kompletny i spójny zestaw operacji stosu LIFO to dostarczane przez interfejs Deque i jego implementacje, które powinny być używane w preferencjach dla tej klasy. Na przykład:

Deque<Integer> stack = new ArrayDeque<>();

Zdecydowanie nie chcę synchronizować zachowania tutaj, ponieważ będzie używać tej struktury danych lokalnie do metody . Poza tym dlaczego mam tu woleć Deque nad Stack?

P. S: javadoc z Deque mówi:

Deques może być również używany jako stosy LIFO (Last-In-First-Out). To interfejs powinien być używany w preferencjach do klasy starszego stosu.
Author: Antonio, 2012-09-21

3 answers

Po pierwsze, jest to bardziej rozsądne pod względem dziedziczenia. Fakt, że Stack rozszerza Vector jest naprawdę dziwny, moim zdaniem. Na początku Javy dziedziczenie było nadużywane IMO - Properties jako kolejny przykład.

Dla mnie kluczowe słowo w przytoczonych dokumentach jest spójne. Deque wyświetla zestaw operacji, który polega na możliwości pobierania/dodawania / usuwania elementów z początku lub końca kolekcji, iteracji itp. - i to wszystko. Celowo nie ma możliwości dostępu do elementu według pozycji, która Stack eksponuje , ponieważ jest podklasą Vector.

Oh, a także Stack nie ma interfejsu, więc jeśli wiesz, że potrzebujesz Stack operacji, kończysz na zaangażowaniu się w konkretną konkretną klasę, co zwykle nie jest dobrym pomysłem.

 138
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 05:49:35

Oto moja interpretacja niespójności wymienionej w opisie klasy stosu.

Jeśli spojrzysz na implementacje ogólnego przeznaczenia tutaj - zobaczysz, że istnieje spójne podejście do implementacji zestawu, Mapy i listy.

  • Dla zestawu i mapy mamy 2 standardowe implementacje z hash mapami i drzewami. Pierwszy jest najczęściej używany, a drugi jest używany, gdy potrzebujemy uporządkowanej struktury (a także implementuje własny interfejs-SortedSet lub SortedMap).

  • Możemy użyć preferowanego stylu deklarowania jak Set<String> set = new HashSet<String>(); zobacz powody tutaj .

Ale Klasa stosu: 1) nie ma własnego interfejsu; 2) jest podklasą klasy wektorowej-która jest oparta na tablicy z możliwością zmiany rozmiaru; więc gdzie jest implementacja listy linkowanej stosu?

W interfejsie Deque nie mamy takich problemów, w tym dwóch implementacji (resizable array - ArrayDeque; linked list-LinkedList).

 2
Author: irudyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-14 14:11:30

Deque jest używany w sytuacji, w której chcemy pobierać elementy zarówno z głowy, jak i z ogona. Jeśli chcesz prosty stos, nie musisz iść po deque.

 -3
Author: Edge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 05:43:33