Храните элементы в массиве и количество занятых позиций. Push пишет в конец, pop уменьшает счётчик; по контракту примера пустые pop и peek возвращают null.
Базовая реализация стека
Храните элементы в массиве и количество занятых позиций. Push пишет в конец, pop уменьшает счётчик; по контракту примера пустые pop и peek возвращают null.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать простой стек с поддержкой базовых операций: добавление элемента, удаление верхнего элемента, просмотр верхнего без удаления и проверка состояний стека (пустой/полный). Требуется создать класс Stack, в котором будут реализованы методы push(), pop(), peek(), isEmpty() и isFull(). В функции main() создаётся стек фиксированного размера, в него помещаются несколько значений, при попытке добавить элемент в переполненный стек обрабатывается исключение, после чего проверяется корректность работы методов peek и pop, выводя результаты сравнения.
public class HelloWorld {
public static void main(String[] args) {
Stack myStack = new Stack(2);
myStack.push(1);
myStack.push(2);
try {
myStack.push(3);
} catch (Exception e) {
}
System.out.println(myStack.peek() == 2);
System.out.println(myStack.pop() == 2);
System.out.println(myStack.peek() == 1);
System.out.println(myStack.pop() == 1);
System.out.println(myStack.pop() == null);
}
static class Stack {
public Stack(int size) {
}
void push(int element) {
}
Integer peek() {
return -1;
}
Integer pop() {
return -1;
}
boolean isEmpty() {
return false;
}
boolean isFull() {
return false;
}
}
}
Ответ
Храните элементы в массиве и количество занятых позиций. Push пишет в конец, pop уменьшает счётчик; по контракту примера пустые pop и peek возвращают null.
static class Stack {
private final int[] data;
private int count;
Stack(int size) {
if (size < 0) throw new IllegalArgumentException();
data = new int[size];
}
void push(int element) {
if (isFull()) throw new IllegalStateException("Stack is full");
data[count++] = element;
}
Integer peek() { return isEmpty() ? null : data[count - 1]; }
Integer pop() { return isEmpty() ? null : data[--count]; }
boolean isEmpty() { return count == 0; }
boolean isFull() { return count == data.length; }
}
Все пять сравнений в main дадут true. Операции O(1), память O(capacity); стек нулевой ёмкости одновременно пуст и полон. Это однопоточная реализация. Переполнение не должно менять уже сохранённые элементы.