Что такое stack java
Перейти к содержимому

Что такое stack java

  • автор:

30.4. Java – Класс Stack

Класс Stack – это подкласс Vector, который реализует стандартный стек last-in, first-out.

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

Stack() 

Методы

Кроме методов, унаследованных от его родительского класса Vector, Stack в Java определяет следующие методы.

Метод и описание
1 boolean empty()
Проверяет, является ли стек пустым. Возвращает true, если стек пустой. Возвращает false, если стек содержит элементы.
2 Object peek()
Возвращает элемент, находящийся в верхней части стэка, но не удаляет его.
3 Object pop()
Возвращает элемент, находящийся в верхней части стэка, удаляя его в процессе.
4 Object push(Object element)
Вталкивает элемент в стек. Элемент также возвращается.
5 int search(Object element)
Ищет элемент в стеке. Если найден, возвращается его смещение от вершины стека. В противном случае возвращается 1.

Пример

Следующая программа показывает несколько методов, поддерживаемых коллекцией Stack в Java:

import java.util.*; public class StackDemo < static void showpush(Stack st, int a) < st.push(new Integer(a)); System.out.println("Втолкнуть(" + a + ")"); System.out.println("Стек: " + st); >static void showpop(Stack st) < System.out.print("Выстрелить ->"); Integer a = (Integer) st.pop(); System.out.println(a); System.out.println("Стек: " + st); > public static void main(String args[]) < Stack st = new Stack(); System.out.println("Стек: " + st); showpush(st, 42); showpush(st, 66); showpush(st, 99); showpop(st); showpop(st); showpop(st); try < showpop(st); >catch (EmptyStackException e) < System.out.println("Пустой стек"); >> > 
Стек: [ ] Втолкнуть (42) Стек: [42] Втолкнуть (66) Стек: [42, 66] Втолкнуть (99) Стек: [42, 66, 99] Выстрелить -> 99 Стек: [42, 66] Выстрелить -> 66 Стек: [42] Выстрелить -> 42 Стек: [ ] Выстрелить -> Пустой стек 

Оглавление

  • 1. Java – Самоучитель для начинающих
  • 2. Java – Обзор языка
  • 3. Java – Установка и настройка
  • 4. Java – Синтаксис
  • 5. Java – Классы и объекты
  • 6. Java – Конструкторы
  • 7. Java – Типы данных и литералы
  • 8. Java – Типы переменных
  • 9. Java – Модификаторы
  • 10. Java – Операторы
  • 11. Java – Циклы и операторы цикла
  • 11.1. Java – Цикл while
  • 11.2. Java – Цикл for
  • 11.3. Java – Улучшенный цикл for
  • 11.4. Java – Цикл do..while
  • 11.5. Java – Оператор break
  • 11.6. Java – Оператор continue
  • 12. Java – Операторы принятия решений
  • 12.1. Java – Оператор if
  • 12.2. Java – Оператор if..else
  • 12.3. Java – Вложенный оператор if
  • 12.4. Java – Оператор switch..case
  • 12.5. Java – Условный оператор (? 🙂
  • 13. Java – Числа
  • 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
  • 13.2. Java – Метод compareTo()
  • 13.3. Java – Метод equals()
  • 13.4. Java – Метод valueOf()
  • 13.5. Java – Метод toString()
  • 13.6. Java – Метод parseInt()
  • 13.7. Java – Метод Math.abs()
  • 13.8. Java – Метод Math.ceil()
  • 13.9. Java – Метод Math.floor()
  • 13.10. Java – Метод Math.rint()
  • 13.11. Java – Метод Math.round()
  • 13.12. Java – Метод Math.min()
  • 13.13. Java – Метод Math.max()
  • 13.14. Java – Метод Math.exp()
  • 13.15. Java – Метод Math.log()
  • 13.16. Java – Метод Math.pow()
  • 13.17. Java – Метод Math.sqrt()
  • 13.18. Java – Метод Math.sin()
  • 13.19. Java – Метод Math.cos()
  • 13.20. Java – Метод Math.tan()
  • 13.21. Java – Метод Math.asin()
  • 13.22. Java – Метод Math.acos()
  • 13.23. Java – Метод Math.atan()
  • 13.24. Java – Метод Math.atan2()
  • 13.25. Java – Метод Math.toDegrees()
  • 13.26. Java – Метод Math.toRadians()
  • 13.27. Java – Метод Math.random()
  • 14. Java – Символы
  • 14.1. Java – Метод Character.isLetter()
  • 14.2. Java – Метод Character.isDigit()
  • 14.3. Java – Метод Character.isWhitespace()
  • 14.4. Java – Метод Character.isUpperCase()
  • 14.5. Java – Метод Character.isLowerCase()
  • 14.6. Java – Метод Character.toUpperCase()
  • 14.7. Java – Метод Character.toLowerCase()
  • 14.8. Java – Метод Character.toString()
  • 15. Java – Строки
  • 15.1. Java – Метод charAt()
  • 15.2. Java – Метод compareTo()
  • 15.3. Java – Метод compareToIgnoreCase()
  • 15.4. Java – Метод concat()
  • 15.5. Java – Метод contentEquals()
  • 15.6. Java – Метод copyValueOf()
  • 15.7. Java – Метод endsWith()
  • 15.8. Java – Метод equals()
  • 15.9. Java – Метод equalsIgnoreCase()
  • 15.10. Java – Метод getBytes()
  • 15.11. Java – Метод getChars()
  • 15.12. Java – Метод hashCode()
  • 15.13. Java – Метод indexOf()
  • 15.14. Java – Метод intern()
  • 15.15. Java – Метод lastIndexOf()
  • 15.16. Java – Метод length()
  • 15.17. Java – Метод matches()
  • 15.18. Java – Метод regionMatches()
  • 15.19. Java – Метод replace()
  • 15.20. Java – Метод replaceAll()
  • 15.21. Java – Метод replaceFirst()
  • 15.22. Java – Метод split()
  • 15.23. Java – Метод startsWith()
  • 15.24. Java – Метод subSequence()
  • 15.25. Java – Метод substring()
  • 15.26. Java – Метод toCharArray()
  • 15.27. Java – Метод toLowerCase()
  • 15.28. Java – Метод toString()
  • 15.29. Java – Метод toUpperCase()
  • 15.30. Java – Метод trim()
  • 15.31. Java – Метод valueOf()
  • 15.32. Java – Классы StringBuilder и StringBuffer
  • 15.32.1. Java – Метод append()
  • 15.32.2. Java – Метод reverse()
  • 15.32.3. Java – Метод delete()
  • 15.32.4. Java – Метод insert()
  • 15.32.5. Java – Метод replace()
  • 16. Java – Массивы
  • 17. Java – Дата и время
  • 18. Java – Регулярные выражения
  • 19. Java – Методы
  • 20. Java – Потоки ввода/вывода, файлы и каталоги
  • 20.1. Java – Класс ByteArrayInputStream
  • 20.2. Java – Класс DataInputStream
  • 20.3. Java – Класс ByteArrayOutputStream
  • 20.4. Java – Класс DataOutputStream
  • 20.5. Java – Класс File
  • 20.6. Java – Класс FileReader
  • 20.7. Java – Класс FileWriter
  • 21. Java – Исключения
  • 21.1. Java – Встроенные исключения
  • 22. Java – Вложенные и внутренние классы
  • 23. Java – Наследование
  • 24. Java – Переопределение
  • 25. Java – Полиморфизм
  • 26. Java – Абстракция
  • 27. Java – Инкапсуляция
  • 28. Java – Интерфейсы
  • 29. Java – Пакеты
  • 30. Java – Структуры данных
  • 30.1. Java – Интерфейс Enumeration
  • 30.2. Java – Класс BitSet
  • 30.3. Java – Класс Vector
  • 30.4. Java – Класс Stack
  • 30.5. Java – Класс Dictionary
  • 30.6. Java – Класс Hashtable
  • 30.7. Java – Класс Properties
  • 31. Java – Коллекции
  • 31.1. Java – Интерфейс Collection
  • 31.2. Java – Интерфейс List
  • 31.3. Java – Интерфейс Set
  • 31.4. Java – Интерфейс SortedSet
  • 31.5. Java – Интерфейс Map
  • 31.6. Java – Интерфейс Map.Entry
  • 31.7. Java – Интерфейс SortedMap
  • 31.8. Java – Класс LinkedList
  • 31.9. Java – Класс ArrayList
  • 31.10. Java – Класс HashSet
  • 31.11. Java – Класс LinkedHashSet
  • 31.12. Java – Класс TreeSet
  • 31.13. Java – Класс HashMap
  • 31.14. Java – Класс TreeMap
  • 31.15. Java – Класс WeakHashMap
  • 31.16. Java – Класс LinkedHashMap
  • 31.17. Java – Класс IdentityHashMap
  • 31.18. Java – Алгоритмы Collection
  • 31.19. Java – Iterator и ListIterator
  • 31.20. Java – Comparator
  • 32. Java – Дженерики
  • 33. Java – Сериализация
  • 34. Java – Сеть
  • 34.1. Java – Обработка URL
  • 35. Java – Отправка Email
  • 36. Java – Многопоточность
  • 36.1. Java – Синхронизация потоков
  • 36.2. Java – Межпоточная связь
  • 36.3. Java – Взаимная блокировка потоков
  • 36.4. Java – Управление потоками
  • 37. Java – Основы работы с апплетами
  • 38. Java – Javadoc

Класс Stack

Современные программисты сейчас практически не используют Stack, который слишком прост и не очень гибок. Тем не менее, изучить его стоит, может именно он вам и пригодится.

Stack является подклассом класса Vector, который реализует простой механизм типа «последний вошёл — первый вышел» (LIFO). Можно представить процесс в виде детской пирамидки, когда вы по одному нанизываете диск на колышек. И снять диски вы сможете только по порядку, начиная с верхнего.

Stack Cat

Взять элемент, который положили первым, вам никто не позволит. Даже не пытайтесь сделать так.

Напишем простейший пример применения стека.

 Stack stack = new Stack<>(); stack.push(0); stack.push(1); stack.push(2); System.out.println("Текущий стек: " + stack); System.out.println("Удаляем: " + stack.pop()); System.out.println("Удаляем: " + stack.pop()); System.out.println("Удаляем: " + stack.pop()); System.out.println("Текущий стек: " + stack); 
 I/System.out: Текущий стек: [0, 1, 2] I/System.out: Удаляем: 2 I/System.out: Удаляем: 1 I/System.out: Удаляем: 0 I/System.out: Текущий стек: [] 

Метод push() помещает объект в стек, а метод pop(), наоборот, вытаскивает объект из стека.

Пример с числами слишком скучный. Давайте позовём на помощь котов. Создадим простой класс Cat:

 package ru.alexanderklimov.expresscourse; public class Cat < private String mName; private int mAge; public Cat(String name, int age) < mName = name; mAge = age; >@Override public String toString() < return this.mName; >> 

Представьте себе, что имеется длинная узкая труба, запаянная с одного конца. Мы заталкиваем в трубу пушистого друга, поэтому метод называется «пуш» (push()). А чтобы вытащить кота, хватаем его за попу (метод pop()). Давайте запихаем в трубу трёх котов, а потом вытащим их.

 Cat barsik = new Cat("Барсик", 4); Cat murzik = new Cat("Мурзик", 6); Cat vaska = new Cat("Васька", 9); Stack catStack = new Stack<>(); catStack.push(barsik); catStack.push(murzik); catStack.push(vaska); Log.i(TAG, "Текущий стек: " + catStack); Log.i(TAG, "Брысь " + catStack.pop()); Log.i(TAG, "Кто последний? " + catStack.peek().toString()); Log.i(TAG, "Брысь " + catStack.pop()); Log.i(TAG, "Кто последний? " + catStack.peek().toString()); Log.i(TAG, "Брысь " + catStack.pop()); Log.i(TAG, "Никого? " + catStack.empty()); try < Log.i(TAG, "Кто последний? " + catStack.peek().toString()); >catch (EmptyStackException e) < Log.i(TAG, "Пустой стек. Некого прогонять"); >Log.i(TAG, "Текущий стек: " + catStack); 

У нас есть три кота — Барсик, Мурзик и Васька. В такой последовательности мы их запихнули в трубу и проверяем текущий стек.

 I/ExpressCourse: Текущий стек: [Барсик, Мурзик, Васька] 

Вызываем метод pop() первый раз. Как видите, мы не указываем позицию элемента, так стек работает только с последним элементом. Последним был Васька. Чтобы узнать, кто теперь последний в стеке, не удаляя его оттуда, нужно вызвать метод peek().

 I/ExpressCourse: Брысь Васька I/ExpressCourse: Кто последний? Мурзик 

Повторяем этот шаг ещё раз и вытаскиваем кота Мурзика. Затем и Барсика.

 I/ExpressCourse: Брысь Мурзик I/ExpressCourse: Кто последний? Барсик I/ExpressCourse: Брысь Барсик 

Чтобы убедиться, что в трубе никого не осталось, вызываем метод empty(), который возвращает булево значение.

 I/ExpressCourse: Никого? true 

Если при пустом стеке вызвать методы pop() или peek(), то программа закроется с ошибкой. Чтобы избежать подобной ситуации, нужно обработать исключение EmptyStackException. Тогда программа будет работать без сбоев.

 I/ExpressCourse: Пустой стек. Некого прогонять 

В конце выводим информацию о пустом стеке.

 I/ExpressCourse: Текущий стек: [] 

У класса также есть метод int search(Object o), который ищет заданный элемент в стеке, возвращая количество операций pop(), которые требуются для того чтобы перевести искомый элемент в вершину стека. Если заданный элемент в стеке отсутствует, этот метод возвращает -1.

Надеюсь, вы поняли что такое стек. Пожалуйста, не загоняйте котов в трубу.

Что такое stack java

Class Stack

  • java.lang.Object
    • java.util.AbstractCollection
      • java.util.AbstractList
        • java.util.Vector
          • java.util.Stack
          • All Implemented Interfaces: Serializable, Cloneable, Iterable, Collection, List, RandomAccess

          The Stack class represents a last-in-first-out (LIFO) stack of objects. It extends class Vector with five operations that allow a vector to be treated as a stack. The usual push and pop operations are provided, as well as a method to peek at the top item on the stack, a method to test for whether the stack is empty, and a method to search the stack for an item and discover how far it is from the top. When a stack is first created, it contains no items. A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example:

           Deque stack = new ArrayDeque();

          Field Summary

          Fields inherited from class java.util.Vector

          Fields inherited from class java.util.AbstractList

          Constructor Summary

          Creates an empty Stack.

          Method Summary

          All Methods Instance Methods Concrete Methods

          Modifier and Type Method and Description
          boolean empty ()

          Tests if this stack is empty.

          Looks at the object at the top of this stack without removing it from the stack.

          Removes the object at the top of this stack and returns that object as the value of this function.

          Pushes an item onto the top of this stack.

          Returns the 1-based position where an object is on this stack.

          Класс Stack

          Хотя класс Box удобен для иллюстрации основных элементов класса, его практическая ценность невелика. Чтобы читатели могли убедиться в реальных возможностях классов, изложение материала этой главы мы завершим более сложным примером. Как вы, возможно, помните из материала по основам объектно-ориентированного программирования (ООП), одно из наибольших преимуществ ООП — это инкапсуляция данных и кода, который манипулирует этими данными. Как было показано, в языке Java класс — это механизм достижения инкапсуляции. Создавая класс, вы создаете новый тип данных, который определяет как сущность данных, которыми будет выполняться манипулирование, так и используемые для этого процедуры. Далее методы задают целостный и управляемый интерфейс к данным класса. Таким образом, класс можно использовать посредством его методов, не заботясь о нюансах его реализации или о действительном способе управления данными внутри класса. В определенном смысле класс подобен «машине данных». Чтобы использовать машину посредством ее элементов управления, не требуются никакие знания о происходящем внутри нее. Фактически, поскольку подробности реализации сокрыты, внутренние детали можно изменять по мере необходимости. До тех пор, пока код использует класс через его методы, внутренние детали могут меняться, не вызывая побочных эффектов за пределами класса.

          В качестве иллюстрации приведенных соображений рассмотрим один из типичных примеров инкапсуляции: стек. Стек хранит данные в порядке «первым вошел, последним вышел». То есть стек подобен стопке тарелок на столе — тарелка, которая была поставлена на стол первой, будет использована последней. Стеки управляются посредством двух операций, которые традиционно называются заталкиванием (в стек) и выталкиванием (из стека). Для помещения элемента на верхушку стека используется операция заталкивания. Для извлечения элемента из стека применяется операция выталкивания. Как вы убедитесь, инкапсуляции всего механизма стека не представляет сложности.

          Ниже приведен код класса, названного Stack, который реализует стек целочисленных значений.

          // Этот класс определяет целочисленный стек, который может хранить 10 значений.
          class Stack int stck[] = new int[10];
          int tos;
          // Инициализация верхушки стека
          Stack() tos = -1;
          >
          // Заталкивание элемента в стек
          void push(int item) if(tos==9)
          System.out.println(«Стек полон.»);
          else
          stck[++tos] = item;
          >
          // Выталкивание элемента из стека int pop () if(tos

          Как видите, класс Stack определяет два элемента данных и три метода. Стек целочисленных значений хранится в массиве stck. Этот массив индексируется по переменной tos, которая всегда содержит индекс верхушки стека. Конструктор StackO инициализирует tos значением -1, которое указывает на пустой стек. Метод push () помещает элемент в стек. Чтобы извлечь элемент, нужно вызвать метод pop (). Поскольку доступ к стеку осуществляется посредством методов push () и pop (), то, что стек хранится в массиве, в действительности не имеет значения при работе со стеком. Например, стек мог бы храниться в более сложной структуре данных вроде связного списка, но интерфейс, определенный методами push () и pop (), оставался бы неизменным.

          Приведенный в следующем примере класс TestStack демонстрирует применение класса Stack. Он создает два целочисленных стека, заталкивает в каждый из них определенные значения, а затем выталкивает их из стека.

          class TestStack public static void main(String args[]) Stack mystackl = new Stack ();
          Stack mystack2 = new Stack();
          // заталкивает числа в стек
          for(int i=0; i

          Эта программа генерирует следующий вывод:

          Как видите, содержимое обоих стеков различается.

          И последнее замечание по поводу класса Stack. В том виде, каком он реализован, массив stck, который содержит стек, может быть изменен кодом, определенным вне класса Stack. Это делает класс Stack уязвимым для злоупотреблений и повреждений. В следующей главе будет показано, как можно исправить эту ситуацию.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *