Стеки и очереди 1. Абстрактный стек public interface Stack { static class Underflow extends Exception { public Underflow() { super("Stack underflow");

Презентация:



Advertisements
Похожие презентации
Абстрактные типы данных 1. Абстрактная дата Date dt1, dt2; dt1 = new Date(1, Date.MARCH, 2006); dt2 = (Date)dt1.clone(); dt2.add(300); //
Advertisements

Test 14 Вопрос 1. class Main { public void method() { static class One { public One() { System.out.println("From one"); } } public static void main(String...
Test 17 Вопрос 1. public class TKO { public static void main(String[] args) { String s = "-"; Integer x = 343; long L343 = 343L; if (x.equals(L343)) s.
Java Collections Framework (JCF) in Java Tutorial for students of universities Author: Oxana Dudnik.
Практическое программирование на Java к.ф.-м.н. Козлов Дмитрий Дмитриевич Кафедра АСВК, Лаборатория Вычислительных комплексов.
Test 10 Вопрос 1. public class Test implements Iterator { // 1 private List list = new ArrayList (); // 2 public void addList(T... ts) { Collections.addAll(list,
Test 11 Вопрос 1. class HashTest { private static Set set = new LinkedHashSet (); public static void main(String[] args) { set.add("one"); set.add("two");
Test 8 Вопрос 1. class Class1 { Class1(int i) { System.out.println("Class1(int)"); } public class Class2 extends Class1 { Class2(double d) { // 1 this((int)
Ассоциативные списки Поиск данных происходит не по индексу или положению объекта, а по его ассоциативной связи: public interface Map { // Доступ к объектам.
Исключения в Java Макаревич Л. Г.. Исключения – это механизм взаимодействия между кодом, приведшим к ошибке, и кодом, обрабатывающим ошибку Исключение.
Объектно-ориентированное программирование Особенности языка Java.
Test 12 Вопрос 1. public class Cast { public static void main (String[] args){ byte b = 128; int i = b; System.out.println(i); } } a)Во время выполнения.
1 Коллекции Коллекции.NET 1.0 Классы коллекций заданы как часть пространства имен System.CollectionsSystem.Collections
Test 16 Вопрос 1. class Clazz { { System.out.println("non-static init"); } public static void main(String a[]) { System.out.println("main"); Clazz ob1.
Test15 Вопрос 1. class AClass { } public class Test { public static void main (String... args) { ArrayList a = new ArrayList (); AClass aaaClass = new.
САОД, кафедра ОСУ1 Реализация списков:динамические структуры ListList classclass структура одного элемента type LIST = celltype; celltype = record.
Обработка исключений Основы метапрограммированияОбработка исключений Основы метапрограммирования.
Интерфейсы и наследование. Интерфейсы Объявление public interface OperateCar { // constant declarations, if any // method signatures int turn(Direction.
4. Алгоритм Бойера - Мура оба одобрили обои бобра обои аби 4424 лор 414 Число сравнений символов: = 10.
Test21 Вопрос 1. public class Test { void a1(Object... i){ System.out.println("[Object... i]"); } void a1(Integer... i){ System.out.println("[Integer...
Транксрипт:

Стеки и очереди 1. Абстрактный стек public interface Stack { static class Underflow extends Exception { public Underflow() { super("Stack underflow"); } }; void push(Object element); Object pop() throws Underflow; Object peek() throws Underflow; boolean empty(); } top

2. Абстрактная очередь public interface Queue { static class Underflow extends Exception { public Underflow() { super(Queue underflow"); } }; void enqueue(Object element); Object dequeue() throws Underflow; Object head() throws Underflow; Object tail() throws Underflow; boolean empty(); } headtail

Различные подходы к реализации стека public interface List { // Elements counting boolean isEmpty(); int size(); // Access to elements Object first(); Object last(); // Changes in list Object addFirst(Object o); Object addLast(Object o); Object removeFirst(); Object removeLast(); // List iteration void iterate(Visitor visitor); Iterator iterator(); } public abstract class MyStack implements List, Stack { boolean empty() { return isEmpty(); } Object peek() { return first(); } Object push(Object o) { return addFirst(o); } Object pop() { return removeFirst(); } } public abstract class AbstractStack implements Stack { private List list; public AbstractStack(List list) { this.list = list; } public boolean isEmpty() { return list.isEmpty(); } public Object push(Object o) { return list.addFirst(o); } public Object pop() { return list.removeFirst(); } public Object peek() { return list.first(); } } public class LinkedStack extends AbstractStack { public LinkedStack() { super(new LinkedList()); } }

Реализация стека в виде массива public class ArrayStack implements Stack { private Object[] stack; // Массив стековых элементов private int topPtr; // Число элементов в стеке - указатель вершины static class Underflow extends Exception { public Underflow() { super("Stack underflow"); } } public ArrayStack(int maxElems) { stack = new Object[maxElems]; topPtr = 0; } public ArrayStack() { this(100); } public boolean empty() { return topPtr == 0; } public Object push(Object element) { if (topPtr == stack.length) throw new Overflow(); return stack[topPtr++] = element; } public Object peek() throws Underflow { if (topPtr == 0) throw new Underflow(); return stack[topPtr-1]; } public Object pop() throws Underflow { if (topPtr == 0) throw new Underflow(); return stack[--topPtr]; }

Реализация пары стеков в массиве public class StackPair { private Object[] stack; int ptr1, ptr2; public StackPair(int max) { stack = new Object[max]; ptr1 = 0; ptr2 = stack.length-1; } public StackPair() { this(100); } Object push1(Object element) throws Stack.Overflow { if (ptr1 > ptr2) throw new Stack.Overflow(); return stack[ptr1++] = element; } Object push2(Object element) throws Stack.Overflow { if (ptr1 > ptr2) throw new Stack.Overflow(); return stack[ptr2--] = element; }... boolean empty1() { return ptr1 == 0; } boolean empty2() { return ptr2 == stack.length-1; } } ptr1 ptr2

Очередь с приоритетами public interface Prioritized { int getPrio(); void setPrio(int prio); } public class PrioQueue implements Queue { Object enqueue(Object element) {...} Object dequeue() throws Underflow {...} Object head() throws Underflow {...} Object tail() throws Underflow { throw new RuntimeException("tail: no implementation"); } boolean empty() {...} Prioritized setPrio(Prioritized obj, int prio) } Пирамида – один из возможных способов реализации очереди с приоритетами:

Применение стеков для анализа выражений 1. Проверка правильности расстановки скобок. 1 + (a + b) * (2 – (c – d) * (a + b)) a[i+1] * (2 – c[i–1] * (a[i] + 1)) []() [] () [] ()

public static boolean parentheses(String openBrackets, String closeBrackets, String source) { Stack pars = new LinkedStack(); for (int i = 0; i < source.length(); i++) { char c = source.charAt(i); // 1. Проверка открывающей скобки int j = openBrackets.indexOf(c); if (j >= 0) { pars.push(new Character(closeBrackets.charAt(j))); continue; } // 2. Проверка закрывающей скобки j = closeBrackets.indexOf(c); if (j >= 0) { try { if (!pars.pop().equals(new Character(c))) return false; } catch (Stack.Underflow u) { return false; } return pars.empty(); } Реализация анализа правильности расстановки скобок

Перевод выражения в обратную польскую запись 1 + (a + b) * (2 – (c – d) * (a + b)) 1 a b + 2 c d – a b + * – * + 1 ab2 c da b + + * - - * + Loadc 1 Load a Load b Add Loadc 2 Load c Load d Sub Load a Load b Add Mult Sub Mult Add 1 a b a+b 2 c d c-d a b a+b (c-d)*(a+b) 2-(c-d)*(a+b) (a+b)* (2-(c-d)*(a+b)) 1+(a+b)* (2-(c-d)*(a+b))

Алгоритм анализа выражения 1 + (a + b) * (2 – (c – d) * (a + b)) Для каждой из лексем: - если это первичное, выводим его; - если это (, кладем ее в стек; - если это операция, выводим не менее приоритетные и кладем ее знак в стек; - если это ), выводим операции до знака ( и вычеркиваем скобку из стека. В конце работы выводим все операции из стека. 1ab+2cd–ab+ * – * ( ( ( ( * *