HTML Diff
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&lt;Integer&gt; current; Stack&lt;Integer&gt; tmp; public MyQueue() { current = new Stack&lt;&gt;(); tmp = new Stack&lt;&gt;(); }<p>Теперь давайте реализуем метод<strong>push</strong>:</p>
17 static class MyQueue { Stack&lt;Integer&gt; current; Stack&lt;Integer&gt; tmp; public MyQueue() { current = new Stack&lt;&gt;(); tmp = new Stack&lt;&gt;(); }<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>