2016-10-09 3 views
1

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

Пример кода

Stack<Integer> s=new Stack<Integer>(); 
    s.push(10); 
    s.push(20); 
    s.push(30); 
    ------------------------------------------------------------------------ 
    Iterator<Integer> itr=s.iterator(); 
    while(itr.hasNext()) 
    { 
     System.out.print(itr.next() + " "); // ouput:- 10 20 30 
    } 

Теперь у меня есть итератор на стек, который может пересекать стек в порядке их поступления, и я даже могу удалить любой элемент, используя itr.remove()

Это очень запутанным :)

Пожалуйста, объясните ...

PS: В случае, если я использую ListIterator на месте O f iterator, тогда это еще более запутанно, потому что предыдущий предоставляет больше методов.

+2

«Только верхний элемент» определенно ошибочен. Стеки обычно позволяют вам обращаться к элементам по отношению к вершине: top-1, top-2 и т. Д. Итератор просто позволяет вам пройти через все элементы таким же образом. – markspace

+2

Возможно, вам следует избегать использования стека, поскольку он поддерживает вектор, где очень метод является потокобезопасным. – SMA

+1

это немного противоречит «чистому» теоретическому стеку, и в большинстве случаев вы не будете использовать его (кроме печати и отладки вашего стека), но это удобно :) Вы можете определить определение стека как «он имеет push, pop, top ', в отличие от' он имеет ТОЛЬКО push, pop, top ' – okaram

ответ

3

Java Stack<T> предоставляет больше операций, чем abstract stack data type. Скорее всего, это делается по историческим причинам, потому что Stack был частью Java 1.0, и его разработчики решили получить его от Vector. Так операции с Vector стали операциями на Stack. После того, как вы разрешите дополнительные публичные операции для открытого класса, нет способа вернуть их.

Это не означает, что класс как-то сломан: если вы не хотите дополнительных операций, предоставляемых Vector<T>, не используйте их в своем коде.

+1

То же самое можно сказать и при переключении на ['Deque'] (http://docs.oracle.com/javase/8/docs/api/java/util/Deque.html), как рекомендовано [javadoc] (http://docs.oracle.com/javase/8/docs/api/java/util/Stack.html) 'Stack'. Если 'Stack' еще не был классом, они, скорее всего, добавили бы интерфейс' Stack' только с методами 'push()', 'pop()' и 'peek()'. – Andreas

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