Материал: 7

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

object pop(): удаляет из стека (выталкивает) и возвращает последний добавленный элемент.

Вспомогательные операции работы со стеком:

object top(): возвращает последний вставленный элемент, не удаляя его (чтение элемента).

integer size(): возвращает количество элементов, которые хранятся

встеке.

boolean isEmpty(): показывает, является ли стек пустым.

Интерфейс для Стека в Java

ВJava есть интерфейс, соответствующий нашему АТД Stack. Требуется импорт для определения класса.

EmptyStackException

Вотличие от встроенного класса Javajava.util.Stack.

public interface Stack { public int size(); public boolean isEmpty(); public Object top()

throws EmptyStackException; public void push(Object o);

public Object pop()

throws EmptyStackException;

}

Исключения при работе со стеком

Попытка выполнения операции с AТД может иногда вызвать состояние ошибки, называемое исключением.

Исключения, как принято говорить, “выбрасывается" с помощью операции, которая не может быть выполнена!

В АТД Stack, операции pop() и top() не могут быть выполнены над элементами, например, если стек пуст.

При попытке (на пустом стеке) выполнить в этом случае операции pop() и top() выбрасывает EmptyStackException.

showpop(st);
} catch (EmptyStackException e) { System.out.println("empty stack");
}

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

import java.util.Stack;

import java.util.EmptyStackException;

class StackExample {

static void showpush(Stack st, int a) { st.push(new Integer(a)); System.out.println("push(" + a + ")"); System.out.println("stack: " + st);

}

static void showpop(Stack st) { System.out.print("pop -> "); Integer a = (Integer) st.pop(); System.out.println(a); System.out.println("stack: " + st);

}

public static void main(String args[]) { Stack st = new Stack(); System.out.println("stack: " + st); showpush(st, 42);

showpush(st, 66); showpush(st, 99); showpop(st); showpop(st); showpop(st);

try {

}

}

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

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

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

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

в текстовом

редакторе

 

 

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

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

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

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

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

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

Когда вызывается метод, виртуальная машина заталкивает в стек фрейм метода, содержащий.

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

Программный счетчик, отслеживающий выполнение операторов

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

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

main() {

int i = 5; foo(i);

}

foo(int j) { int k; k = j+1; bar(k);

}

bar(int m) {

}

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

Простой способ реализации AТД стека с использованием массива. Мы добавляем элементы слева направо.

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

Algorithm size() { return t + 1; }

Algorithm pop()

{if ( isEmpty() )

throw EmptyStackException; else

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

}

Массив для хранения элементов стека может заполнится. Операция push() вызовет выброс исключения FullStackException.

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

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

Algorithm push(o)

{

if ( t = S.length - 1)

throw FullStackException;

else

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

}

}

Производительность и ограничения

Производительность

Пусть n число элементов в стеке

Используемое пространство O(n)

Каждая операция занимает время выполнения O(1) Ограничения

Максимальный размер стека должен быть определен заранее и не может быть изменен

Попытка затолкннуть новый элемент в полный стек вызывает соответствующее исключение переполнение—Overflow.

Стек на основе массива в Java

public class ArrayStack implements Stack {

//содержит элементы стека private Object S[ ];

//индекс верхнего элемента private int top = -1;

//конструктор

public ArrayStack(int capacity) { S = new Object[capacity]);

}

public Object pop()

throws EmptyStackException { if isEmpty()

throw new EmptyStackException (“Empty stack: cannot pop”);

Object temp = S[top]; // облегчает сбор мусора

S[top] = null; top = top – 1; return temp;

}

Стек на основе связанного списка

Мы можем реализовать стек в виде односвязного списка. Верхний элемент (верхушка стека) хранится в первом узле списка.

Используемое пространство - O(n) и каждая операция стека над ATД занимает время O (1).

Пример Стек на основе связанного списка (1/4)

Верхушка стека – заглавный элемент связанного списка. Переменная экземпляра сохраняет текущее количество элементов. Push():создать новый узел и добавить его в верхнюю часть стека. Pop():удалить узел из верхней части стека.

public class Node<E> { // поля класса: private E element;

private Node<E> next;