Структура Даних Deque у Java
Двобічна черга
Deque, або двобічна черга, дозволяє працювати з чергами як з початку, так і з кінця.
Інтерфейс Deque розширює інтерфейс Queue, тому клас, наприклад, LinkedList також реалізує цей інтерфейс.
Відповідно, знову використовується LinkedList, але цього разу з новим інтерфейсом.
Оголошення об'єкта типу Deque не відрізняється від Queue:
Main.java
1Deque<T> deque = new LinkedList<>();
Головна відмінність проявляється, коли ми переходимо до методів цього інтерфейсу.
Оскільки Deque є чергою з двома кінцями (double-ended queue), тобто можна працювати з елементами як на початку, так і в кінці черги, його методи адаптовані до цієї особливості.
Методи
Деякі основні методи інтерфейсу Deque:
addFirst(element): додає елемент на початок двосторонньої черги;addLast(element): додає елемент у кінець двосторонньої черги.
Очевидно, у двосторонній черзі існують методи для додавання на початок і в кінець. Назви цих методів говорять самі за себе. Розглянемо ці методи у коді:
Main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }
Як ви можете бачити, після використання методу addFirst(), елемент було додано на початок двосторонньої черги. Це відрізняє його від методу addLast().
У Deque також є звичайний метод add(), який працює так само, як і метод addLast(). Тому вибір методу повністю залежить від вас.
Методи видалення
Якщо існують методи для додавання елементів на початок і кінець, мають бути й методи для видалення з початку та кінця двосторонньої черги.
removeFirst(): видаляє та повертає елемент з початку двосторонньої черги;removeLast(): видаляє та повертає елемент з кінця двосторонньої черги.
Методи addFirst() та addLast() виконують видалення елементів з початку та кінця двосторонньої черги.
Розглянемо приклад використання в коді:
Main.java
1234567891011121314151617package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }
Як бачите, ми видалили перший і останній елементи з двосторонньої черги, залишивши лише другий елемент.
Це просто та зручно, а назви методів говорять самі за себе.
Методи отримання елементів
Далі розглянемо методи для доступу до елементів у двосторонній черзі.
getFirst(): отримує, але не видаляє елемент на початку двосторонньої черги;getLast(): отримує, але не видаляє елемент у кінці двосторонньої черги.
Це дозволяє отримати доступ до першого та останнього елементів у двосторонній черзі.
Тепер розглянемо приклад у коді:
Main.java
123456789101112131415161718package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }
Використовуючи методи getFirst() та getLast(), ми отримали перший і останній елементи з двосторонньої черги та присвоїли їх новоствореним змінним.
В інтерфейсі Deque також існують методи peekFirst() і peekLast(), які вирішують проблему виникнення виключення. Замість того, щоб кидати виключення та зупиняти програму, вони повертають null, якщо черга порожня.
Розглянемо приклад:
Main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }
З цього прикладу стало очевидно, що набагато краще використовувати методи peekFirst() і peekLast() замість getFirst() і getLast(), оскільки вони не зупиняють програму у разі помилки.
Однак не забувайте про NullPointerException! Це виключення може спричинити багато проблем у вашій програмі.
Існують також еквівалентні альтернативні методи для методів addFirst(), addLast(), removeFirst() та removeLast(). Ми не будемо детально зупинятися на них, оскільки ви вже розумієте, як працюють ці методи, але ось перелік:
Альтернативні методи
Методи для додавання елемента до дека:
offerFirst(E e): додає елемент на початок дека, якщо це можливо, і повертаєtrue. Повертаєfalse, якщо додавання неможливе;offerLast(E e): додає елемент в кінець дека, якщо це можливо, і повертаєtrue. Повертаєfalse, якщо додавання неможливе;push(E e): додає елемент на початок дека, аналогічно доaddFirst(). Зверніть увагу, щоpush()також є методом стеку у класіDeque.
Методи для видалення елемента з дека:
pollFirst(): видаляє та повертає перший елемент дека. Повертаєnull, якщо дек порожній;pollLast(): видаляє та повертає останній елемент дека. Повертаєnull, якщо дек порожній;pop(): видаляє та повертає перший елемент дека, аналогічно доremoveFirst().
Вибір залежить від вимог програми. Завжди можна реалізувати все за допомогою звичайного масиву, але це буде досить складно і не оптимізовано. Саме тому існує так багато різних структур даних — щоб зробити написання різних програм зручнішим.
1. Що означає "Deque"?
2. Який інтерфейс у Java представляє Deque?
3. Яке призначення методу addFirst() у Deque?
4. Який метод використовується для отримання, але не видалення, останнього елемента Deque?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
What are some real-world use cases for a Deque?
Can you explain the difference between a Deque and a regular Queue?
How do I choose between using addFirst/addLast and offerFirst/offerLast?
Чудово!
Completion показник покращився до 4
Структура Даних Deque у Java
Свайпніть щоб показати меню
Двобічна черга
Deque, або двобічна черга, дозволяє працювати з чергами як з початку, так і з кінця.
Інтерфейс Deque розширює інтерфейс Queue, тому клас, наприклад, LinkedList також реалізує цей інтерфейс.
Відповідно, знову використовується LinkedList, але цього разу з новим інтерфейсом.
Оголошення об'єкта типу Deque не відрізняється від Queue:
Main.java
1Deque<T> deque = new LinkedList<>();
Головна відмінність проявляється, коли ми переходимо до методів цього інтерфейсу.
Оскільки Deque є чергою з двома кінцями (double-ended queue), тобто можна працювати з елементами як на початку, так і в кінці черги, його методи адаптовані до цієї особливості.
Методи
Деякі основні методи інтерфейсу Deque:
addFirst(element): додає елемент на початок двосторонньої черги;addLast(element): додає елемент у кінець двосторонньої черги.
Очевидно, у двосторонній черзі існують методи для додавання на початок і в кінець. Назви цих методів говорять самі за себе. Розглянемо ці методи у коді:
Main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }
Як ви можете бачити, після використання методу addFirst(), елемент було додано на початок двосторонньої черги. Це відрізняє його від методу addLast().
У Deque також є звичайний метод add(), який працює так само, як і метод addLast(). Тому вибір методу повністю залежить від вас.
Методи видалення
Якщо існують методи для додавання елементів на початок і кінець, мають бути й методи для видалення з початку та кінця двосторонньої черги.
removeFirst(): видаляє та повертає елемент з початку двосторонньої черги;removeLast(): видаляє та повертає елемент з кінця двосторонньої черги.
Методи addFirst() та addLast() виконують видалення елементів з початку та кінця двосторонньої черги.
Розглянемо приклад використання в коді:
Main.java
1234567891011121314151617package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }
Як бачите, ми видалили перший і останній елементи з двосторонньої черги, залишивши лише другий елемент.
Це просто та зручно, а назви методів говорять самі за себе.
Методи отримання елементів
Далі розглянемо методи для доступу до елементів у двосторонній черзі.
getFirst(): отримує, але не видаляє елемент на початку двосторонньої черги;getLast(): отримує, але не видаляє елемент у кінці двосторонньої черги.
Це дозволяє отримати доступ до першого та останнього елементів у двосторонній черзі.
Тепер розглянемо приклад у коді:
Main.java
123456789101112131415161718package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }
Використовуючи методи getFirst() та getLast(), ми отримали перший і останній елементи з двосторонньої черги та присвоїли їх новоствореним змінним.
В інтерфейсі Deque також існують методи peekFirst() і peekLast(), які вирішують проблему виникнення виключення. Замість того, щоб кидати виключення та зупиняти програму, вони повертають null, якщо черга порожня.
Розглянемо приклад:
Main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }
З цього прикладу стало очевидно, що набагато краще використовувати методи peekFirst() і peekLast() замість getFirst() і getLast(), оскільки вони не зупиняють програму у разі помилки.
Однак не забувайте про NullPointerException! Це виключення може спричинити багато проблем у вашій програмі.
Існують також еквівалентні альтернативні методи для методів addFirst(), addLast(), removeFirst() та removeLast(). Ми не будемо детально зупинятися на них, оскільки ви вже розумієте, як працюють ці методи, але ось перелік:
Альтернативні методи
Методи для додавання елемента до дека:
offerFirst(E e): додає елемент на початок дека, якщо це можливо, і повертаєtrue. Повертаєfalse, якщо додавання неможливе;offerLast(E e): додає елемент в кінець дека, якщо це можливо, і повертаєtrue. Повертаєfalse, якщо додавання неможливе;push(E e): додає елемент на початок дека, аналогічно доaddFirst(). Зверніть увагу, щоpush()також є методом стеку у класіDeque.
Методи для видалення елемента з дека:
pollFirst(): видаляє та повертає перший елемент дека. Повертаєnull, якщо дек порожній;pollLast(): видаляє та повертає останній елемент дека. Повертаєnull, якщо дек порожній;pop(): видаляє та повертає перший елемент дека, аналогічно доremoveFirst().
Вибір залежить від вимог програми. Завжди можна реалізувати все за допомогою звичайного масиву, але це буде досить складно і не оптимізовано. Саме тому існує так багато різних структур даних — щоб зробити написання різних програм зручнішим.
1. Що означає "Deque"?
2. Який інтерфейс у Java представляє Deque?
3. Яке призначення методу addFirst() у Deque?
4. Який метод використовується для отримання, але не видалення, останнього елемента Deque?
Дякуємо за ваш відгук!