0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>21 ноя 2022</li>
2
<ul><li>21 ноя 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Задача: создать очередь с помощью стеков</h2>
4
</ul><h2>Задача: создать очередь с помощью стеков</h2>
5
<p>Решаем задачи, которые дают программистам на собеседованиях в IT-компаниях. Сегодня пытаемся понять, как сделать очередь из нескольких стеков.</p>
5
<p>Решаем задачи, которые дают программистам на собеседованиях в IT-компаниях. Сегодня пытаемся понять, как сделать очередь из нескольких стеков.</p>
6
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
6
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
7
<p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
7
<p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
8
<p><strong>Условие.</strong>Реализовать first-in-first-out (FIFO) очередь, используя максимум два стека. Она должна поддерживать все стандартные функции обычной очереди -<strong>push</strong>,<strong>pop, peek</strong>и <strong>empty</strong>.</p>
8
<p><strong>Условие.</strong>Реализовать first-in-first-out (FIFO) очередь, используя максимум два стека. Она должна поддерживать все стандартные функции обычной очереди -<strong>push</strong>,<strong>pop, peek</strong>и <strong>empty</strong>.</p>
9
<ul><li><strong>push</strong> - добавляет элемент в конец очереди;</li>
9
<ul><li><strong>push</strong> - добавляет элемент в конец очереди;</li>
10
<li><strong>pop</strong> - убирает элемент из начала и возвращает его как результат;</li>
10
<li><strong>pop</strong> - убирает элемент из начала и возвращает его как результат;</li>
11
<li><strong>peek</strong> - возвращает элемент из начала очереди, но не убирает его;</li>
11
<li><strong>peek</strong> - возвращает элемент из начала очереди, но не убирает его;</li>
12
<li><strong>empty</strong> - возвращает<strong>true</strong>,<strong></strong>если очередь пустая, иначе -<strong>false</strong>.</li>
12
<li><strong>empty</strong> - возвращает<strong>true</strong>,<strong></strong>если очередь пустая, иначе -<strong>false</strong>.</li>
13
</ul><p><strong>Примечание:</strong>вы должны использовать только стандартные операции со стеками -<strong>push</strong>,<strong>peek</strong>/<strong>pop</strong>,<strong>size</strong>и <strong>empty</strong>. А если ваш язык не поддерживает стеки, то их можно реализовать через обычный список или двустороннюю очередь, но при этом использовать только функции, приведённые выше.</p>
13
</ul><p><strong>Примечание:</strong>вы должны использовать только стандартные операции со стеками -<strong>push</strong>,<strong>peek</strong>/<strong>pop</strong>,<strong>size</strong>и <strong>empty</strong>. А если ваш язык не поддерживает стеки, то их можно реализовать через обычный список или двустороннюю очередь, но при этом использовать только функции, приведённые выше.</p>
14
Ввод: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] Вывод: [null, null, null, 1, 1, false] Пояснение: MyQueue myQueue = new MyQueue(); myQueue.push(1); // очередь: [1] myQueue.push(2); // очередь: [1, 2] (начало очереди - самый левый элемент) myQueue.peek(); // вернёт 1 myQueue.pop(); // вернёт 1, очередь: [2] myQueue.empty(); // вернёт false<p>Решить эту задачу самостоятельно и на разных языках программирования можно на <a>LeetCode</a>. Наше решение взято из телеграм-канала Сергея<a>Cracking code interview</a>.</p>
14
Ввод: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] Вывод: [null, null, null, 1, 1, false] Пояснение: MyQueue myQueue = new MyQueue(); myQueue.push(1); // очередь: [1] myQueue.push(2); // очередь: [1, 2] (начало очереди - самый левый элемент) myQueue.peek(); // вернёт 1 myQueue.pop(); // вернёт 1, очередь: [2] myQueue.empty(); // вернёт false<p>Решить эту задачу самостоятельно и на разных языках программирования можно на <a>LeetCode</a>. Наше решение взято из телеграм-канала Сергея<a>Cracking code interview</a>.</p>
15
<p><strong>Решение</strong></p>
15
<p><strong>Решение</strong></p>
16
<p>Мы будем решать задачу с помощью двух стеков. Самое сложное - реализовать методы<strong>pop</strong>и <strong>peak</strong>. Но для начала давайте создадим наш класс:</p>
16
<p>Мы будем решать задачу с помощью двух стеков. Самое сложное - реализовать методы<strong>pop</strong>и <strong>peak</strong>. Но для начала давайте создадим наш класс:</p>
17
static class MyQueue { Stack<Integer> current; Stack<Integer> tmp; public MyQueue() { current = new Stack<>(); tmp = new Stack<>(); }<p>Теперь давайте реализуем метод<strong>push</strong>:</p>
17
static class MyQueue { Stack<Integer> current; Stack<Integer> tmp; public MyQueue() { current = new Stack<>(); tmp = new Stack<>(); }<p>Теперь давайте реализуем метод<strong>push</strong>:</p>
18
public void push(int x) { current.push(x); }<p>Всё просто - добавляем новый элемент в стек<strong>current</strong>.</p>
18
public void push(int x) { current.push(x); }<p>Всё просто - добавляем новый элемент в стек<strong>current</strong>.</p>
19
<p>Теперь давайте напишем метод<strong>pop</strong>. Для него нам нужно переместить все элементы из стека<strong>current</strong>в стек<strong>tmp</strong>. А перед этим - проверить стек<strong>tmp</strong>: если в нём есть элементы, то нам просто нужно вернуть элемент из этого стека.</p>
19
<p>Теперь давайте напишем метод<strong>pop</strong>. Для него нам нужно переместить все элементы из стека<strong>current</strong>в стек<strong>tmp</strong>. А перед этим - проверить стек<strong>tmp</strong>: если в нём есть элементы, то нам просто нужно вернуть элемент из этого стека.</p>
20
<p>В виде кода это выглядит так:</p>
20
<p>В виде кода это выглядит так:</p>
21
public int pop() { if (!tmp.isEmpty()) { return tmp.pop(); } while (!current.isEmpty()) { tmp.push(current.pop()); } return tmp.pop();<p>Чтобы продемонстрировать правильность работы этой фукнции, давайте посмотрим на пример:</p>
21
public int pop() { if (!tmp.isEmpty()) { return tmp.pop(); } while (!current.isEmpty()) { tmp.push(current.pop()); } return tmp.pop();<p>Чтобы продемонстрировать правильность работы этой фукнции, давайте посмотрим на пример:</p>
22
<ul><li>push 1 → 1;</li>
22
<ul><li>push 1 → 1;</li>
23
<li>push 2 → 2, 1;</li>
23
<li>push 2 → 2, 1;</li>
24
<li>push 3 → 3, 2, 1;</li>
24
<li>push 3 → 3, 2, 1;</li>
25
<li>pop → перемещаем всё в tmp:<strong>cur</strong>: 2, 1;<strong>tmp</strong>: 3 →<strong>cur</strong>: 1;<strong>tmp</strong>: 2, 3 →<strong>cur</strong>: ;<strong>tmp</strong>: 1, 2, 3;</li>
25
<li>pop → перемещаем всё в tmp:<strong>cur</strong>: 2, 1;<strong>tmp</strong>: 3 →<strong>cur</strong>: 1;<strong>tmp</strong>: 2, 3 →<strong>cur</strong>: ;<strong>tmp</strong>: 1, 2, 3;</li>
26
<li>теперь все элементы в <strong>tmp</strong>стоят в правильном порядке.</li>
26
<li>теперь все элементы в <strong>tmp</strong>стоят в правильном порядке.</li>
27
</ul><p>Получается, когда мы переносим элементы из одного стека в другой, этот процесс похож на функцию<strong>insert</strong>для очередей. Поэтому оно и работает.</p>
27
</ul><p>Получается, когда мы переносим элементы из одного стека в другой, этот процесс похож на функцию<strong>insert</strong>для очередей. Поэтому оно и работает.</p>
28
<p>Теперь по похожей логике давайте напишем функцию<strong>peek</strong>:</p>
28
<p>Теперь по похожей логике давайте напишем функцию<strong>peek</strong>:</p>
29
public int peek() { if (!tmp.isEmpty()) { return tmp.peek(); } while (!current.isEmpty()) { tmp.push(current.pop()); } return tmp.peek();<p>И последнее - метод<strong>empty</strong>:</p>
29
public int peek() { if (!tmp.isEmpty()) { return tmp.peek(); } while (!current.isEmpty()) { tmp.push(current.pop()); } return tmp.peek();<p>И последнее - метод<strong>empty</strong>:</p>
30
public boolean empty() { if (!tmp.isEmpty()) { return tmp.isEmpty(); } return current.isEmpty(); }<p>Здесь нам важно не забыть проверить вторую очередь.</p>
30
public boolean empty() { if (!tmp.isEmpty()) { return tmp.isEmpty(); } return current.isEmpty(); }<p>Здесь нам важно не забыть проверить вторую очередь.</p>
31
<p><strong>Результаты</strong></p>
31
<p><strong>Результаты</strong></p>
32
<p><strong>Временная сложность:</strong>лучший случай - O(1), худший - O(n).</p>
32
<p><strong>Временная сложность:</strong>лучший случай - O(1), худший - O(n).</p>
33
<p><strong>Ёмкостная сложность:</strong>O(1) - нам нужно заранее определённое количество места в памяти.</p>
33
<p><strong>Ёмкостная сложность:</strong>O(1) - нам нужно заранее определённое количество места в памяти.</p>
34
<a>Научитесь: Профессия Java-разработчик + ИИ Узнать больше</a>
34
<a>Научитесь: Профессия Java-разработчик + ИИ Узнать больше</a>