Материал: 7 - Презентация - Дженерики, Абстрактные типы данных, Стек, Очередь

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Центрдистанционногообучения

Интерфейс Стек в Java

stack: [] push(42) stack: [42] push(66) stack: [42, 66] push(99)

stack: [42, 66, 99] pop -> 99

stack: [42, 66] pop -> 66

21 online.mirea.ru

Центрдистанционногообучения

Применение стеков

Прямое применение

история посещений страниц в веб-браузере

Последовательность отмены операций (undo) в текстовом редакторе

цепочка вызовов метода в виртуальной машине Java

Косвенное применение

Вспомогательная структура данных для алгоритмов

Компонент других структур данных

22 online.mirea.ru

Стек метода в JVM

Java Virtual Machine (JVM) отслеживает цепочки вызова активных методов со стеком

Когда вызывается метод, виртуальная

машина заталкивает в стек фрейм метода, содержащий

Локальные переменные и возвращаемое значение

Программный счетчик,

отслеживающий выполнение операторов

Когда метод заканчивается, то его фрейм извлекается из стека и управление передается методу, на вершине стека

Это позволяет делать рекурсивные методы

Центрдистанционногообучения

main() {

 

int i = 5;

bar

foo(i);

PC = 1

}

m = 6

foo(int j) {

 

foo

int k;

PC = 3

k = j+1;

j = 5

bar(k);

k = 6

}

 

 

bar(int m) {

main

PC = 2

i = 5

}

 

 

23 online.mirea.ru

Центрдистанционногообучения

Стек на основе массива (1/2)

Простой способ реализации AТД стека с использованием массива

Мы добавляем элементы слева направо

Переменная хранит индекс верхнего элемента

Algorithm size() { return t + 1; }

Algorithm pop() { if ( isEmpty() )

throw EmptyStackException; else

t = t - 1; return S[t + 1];

}

S

 

0 1 2

24

online.mirea.ru

t

Центрдистанционногообучения

Стек на основе массива (2/2)

Массив для хранения элементов стека может заполнится

Операция push() вызовет выброс исключения FullStackException

Ограничение реализации на базе массивов

Не свойственно по отношению к Stack как ADT

Algorithm push(o)

{

if ( t = S.length - 1)

throw FullStackException; else

{t = t + 1; S[t] = o;

}

}

S

0 1 2

 

25

t

online.mirea.ru