Содержание
- 2. 2. Абстрактная очередь public interface Queue { static class Underflow extends Exception { public Underflow() {
- 3. Различные подходы к реализации стека public interface List { // Elements counting boolean isEmpty(); int size();
- 4. Реализация стека в виде массива public class ArrayStack implements Stack { private Object[] stack; // Массив
- 5. Реализация пары стеков в массиве public class StackPair { private Object[] stack; int ptr1, ptr2; public
- 6. Очередь с приоритетами public interface Prioritized { int getPrio(); void setPrio(int prio); } public class PrioQueue
- 7. Применение стеков для анализа выражений 1. Проверка правильности расстановки скобок. 1 + (a + b) *
- 8. public static boolean parentheses(String openBrackets, String closeBrackets, String source) { Stack pars = new LinkedStack(); for
- 9. Перевод выражения в обратную польскую запись 1 + (a + b) * (2 – (c –
- 11. Скачать презентацию
2. Абстрактная очередь
public interface Queue {
static class Underflow extends Exception
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();
}
Различные подходы к реализации стека
public interface List {
// Elements counting
Различные подходы к реализации стека
public interface List {
// Elements counting
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
Реализация стека в виде массива
public class ArrayStack implements Stack {
private
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;
Реализация пары стеков в массиве
public class StackPair {
private Object[] stack;
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
Очередь с приоритетами
public interface Prioritized {
int getPrio();
void setPrio(int prio);
}
public
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)
}
2
1
2
4
3
1
Пирамида – один из возможных
способов реализации очереди
с приоритетами:
Применение стеков для анализа выражений
1. Проверка правильности расстановки скобок.
1 + (a
Применение стеков для анализа выражений
1. Проверка правильности расстановки скобок.
1 + (a
1 + a[i+1] * (2 – c[i–1] * (a[i] + 1))
public static boolean parentheses(String openBrackets,
String closeBrackets,
String source)
{
public static boolean parentheses(String openBrackets,
String closeBrackets,
String source)
{
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) *
Перевод выражения в обратную польскую запись
1 + (a + b) *
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
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))