1 / 10

Стеки и очереди

top. Стеки и очереди. 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;

Download Presentation

Стеки и очереди

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. top Стеки и очереди 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(); }

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

  3. Различные подходы к реализации стека 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 classMyStack implements List, Stack { booleanempty() { return isEmpty(); } Object peek() { return first(); } Object push(Object o) { return addFirst(o); } Object pop() {returnremoveFirst(); } } 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()); } }

  4. Реализация стека в виде массива 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]; } }

  5. Реализация пары стеков в массиве 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

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

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

  8. Реализация анализа правильности расстановки скобок public static boolean parentheses(String openBrackets, String closeBrackets, String source) { Stack pars = newLinkedStack(); 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(); }

  9. + 1 * - + * a b 2 + - b d a c Перевод выражения в обратную польскую запись 1 + (a + b) * (2 – (c – d) * (a + 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)* (2-(c-d)*(a+b)) 1 a+b (a+b)* (2-(c-d)*(a+b)) a 2-(c-d)*(a+b) b 2 c-d (c-d)*(a+b) c d a a+b b 1 a b + 2 c d –a b + * – * +

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

More Related