93. Реализация стека с `push`, `pop`, `peekMax` за O(1)
Условие задачи:
📌 Нужно реализовать свой класс стека, который поддерживает операции:
push(x)— положить элемент в стекpop()— удалить верхний элементpeekMax()— вернуть максимальный элемент в стеке за O(1)
Код:
// Реализовать стек с поддержкой max за O(1)
Спойлеры к решению
Подсказки
💡 Классическое решение — использовать два стека.
💡 Основной стек хранит значения.
💡 Второй стек хранит текущий максимум на каждом уровне.
💡 Тогда
💡 Основной стек хранит значения.
💡 Второй стек хранит текущий максимум на каждом уровне.
💡 Тогда
peekMax() работает за O(1).Решение
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.NoSuchElementException;
public class MaxStack {
private final Deque<Integer> stack = new ArrayDeque<>();
private final Deque<Integer> maxStack = new ArrayDeque<>();
public void push(int value) {
stack.push(value);
if (maxStack.isEmpty()) {
maxStack.push(value);
} else {
maxStack.push(Math.max(value, maxStack.peek()));
}
}
public int pop() {
if (stack.isEmpty()) {
throw new NoSuchElementException("Stack is empty");
}
maxStack.pop();
return stack.pop();
}
public int peekMax() {
if (maxStack.isEmpty()) {
throw new NoSuchElementException("Stack is empty");
}
return maxStack.peek();
}
}