Skip to content

Commit 800896f

Browse files
committed
Add Queue and Deque data structure
1 parent 2e0286c commit 800896f

File tree

9 files changed

+925
-3
lines changed

9 files changed

+925
-3
lines changed

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ A repository for understanding Java data structures. Covers primitive data types
4040
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── [**`Hash Map`**](./non-primitive-data-types/collections/Map/Hash-Map/) [<sub>HashMapDataStructure.java</sub>](./non-primitive-data-types/collections/Map/Hash-Map/HashMapDataStructure.java)<br>
4141
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── [**`Linked Hash Map`**](./non-primitive-data-types/collections/Map/Linked-Hash-Map/) [<sub>LinkedHashMapDataStructure.java</sub>](./non-primitive-data-types/collections/Map/Linked-Hash-Map/LinkedHashMapDataStructure.java)<br>
4242
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── [**`Tree Map`**](./non-primitive-data-types/collections/Map/Tree-Map/) [<sub>TreeMapDataStructure.java</sub>](./non-primitive-data-types/collections/Map/Tree-Map/TreeMapDataStructure.java)<br>
43-
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── [**`Hash table`**](./non-primitive-data-types/collections/Map/Hash-table/) [<sub>HashtableDataStructure.java</sub>](./non-primitive-data-types/collections/Map/Hash-table/HashtableDataStructure.java)<br>
44-
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── [**`Queue`**](./non-primitive-data-types/collections/Queue/) [<sub>QueueInterface.java</sub>](./non-primitive-data-types/collections/Queue/QueueExample.java)<br>
45-
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── [**`Deque`**](./non-primitive-data-types/collections/Deque/) [<sub>DequeInterface.java</sub>](./non-primitive-data-types/collections/Deque/DequeExample.java)<br>│<br>
43+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── [**`Hash table`**](./non-primitive-data-types/collections/Map/Hash-table/) [<sub>HashtableDataStructure.java</sub>](./non-primitive-data-types/collections/Map/Hash-table/HashtableDataStructure.java)<br>
44+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── [**`Queue`**](./non-primitive-data-types/collections/Queue/) [<sub>QueueInterface.java</sub>](./non-primitive-data-types/collections/Queue/QueueInterface.java)<br>
45+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── [**`Priority Queue`**](./non-primitive-data-types/collections/Queue/Priority-Queue/) [<sub>PriorityQueueDataStructure.java</sub>](./non-primitive-data-types/collections/Queue/Priority-Queue/PriorityQueueDataStructure.java)<br>
46+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── [**`Deque`**](./non-primitive-data-types/collections/Deque/) [<sub>DequeInterface.java</sub>](./non-primitive-data-types/collections/Deque/DequeInterface.java)<br>│<br>
47+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── [**`Array Deque`**](./non-primitive-data-types/collections/Deque/Array-Deque/) [<sub>ArrayDequeDataStructure.java</sub>](./non-primitive-data-types/collections/Deque/Array-Deque/ArrayDequeDataStructure.java)<br>
4648
│<br>
4749
├── README.md<br>
4850
│<br>
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import java.util.*;
2+
3+
public class ArrayDequeDataStructure {
4+
public static void main(String[] args) {
5+
// Create an ArrayDeque
6+
ArrayDeque<String> arrayDeque = new ArrayDeque<>();
7+
8+
// Add elements
9+
arrayDeque.offer("Apple");
10+
arrayDeque.offer("Banana");
11+
arrayDeque.offer("Cherry");
12+
arrayDeque.offer("Date");
13+
arrayDeque.offer("Elderberry");
14+
15+
// Demonstrate basic operations
16+
demonstrateBasicOperations(arrayDeque);
17+
18+
// Demonstrate advanced operations
19+
demonstrateAdvancedOperations(arrayDeque);
20+
21+
// Demonstrate ArrayDeque specific methods
22+
demonstrateArrayDequeSpecificMethods(arrayDeque);
23+
}
24+
25+
public static void demonstrateBasicOperations(ArrayDeque<String> arrayDeque) {
26+
System.out.println("Basic ArrayDeque Operations:");
27+
28+
// Check size
29+
System.out.println("Size of the ArrayDeque: " + arrayDeque.size());
30+
31+
// Access and remove elements (ArrayDeque does not allow direct access by index)
32+
System.out.println("Poll the first element: " + arrayDeque.pollFirst());
33+
System.out.println("Poll the last element: " + arrayDeque.pollLast());
34+
35+
// Check if an element exists
36+
System.out.println("Contains 'Banana': " + arrayDeque.contains("Banana"));
37+
38+
// Iterate over elements
39+
System.out.println("ArrayDeque elements:");
40+
for (String fruit : arrayDeque) {
41+
System.out.println(fruit);
42+
}
43+
44+
// Clear the ArrayDeque
45+
arrayDeque.clear();
46+
System.out.println("Is ArrayDeque empty? " + arrayDeque.isEmpty());
47+
System.out.println(); // Empty line for better readability
48+
}
49+
50+
public static void demonstrateAdvancedOperations(ArrayDeque<String> arrayDeque) {
51+
System.out.println("Advanced ArrayDeque Operations:");
52+
53+
// Add elements again for demonstration
54+
arrayDeque.offer("Apple");
55+
arrayDeque.offer("Banana");
56+
arrayDeque.offer("Cherry");
57+
arrayDeque.offer("Date");
58+
arrayDeque.offer("Elderberry");
59+
60+
// Peek the first and last elements
61+
System.out.println("First element: " + arrayDeque.peekFirst());
62+
System.out.println("Last element: " + arrayDeque.peekLast());
63+
64+
// Remove specific element
65+
arrayDeque.remove("Banana");
66+
System.out.println("ArrayDeque after removing 'Banana': " + arrayDeque);
67+
68+
// Convert ArrayDeque to array
69+
Object[] array = arrayDeque.toArray();
70+
System.out.println("Array from ArrayDeque: " + Arrays.toString(array));
71+
72+
// Reverse the ArrayDeque (not directly supported, but can be done manually)
73+
List<String> list = new ArrayList<>(arrayDeque);
74+
Collections.reverse(list);
75+
System.out.println("Reversed ArrayDeque (using List): " + list);
76+
77+
System.out.println(); // Empty line for better readability
78+
}
79+
80+
public static void demonstrateArrayDequeSpecificMethods(ArrayDeque<String> arrayDeque) {
81+
System.out.println("ArrayDeque Specific Methods:");
82+
83+
// Add elements again for demonstration
84+
arrayDeque.offer("Fig");
85+
86+
// Use the addFirst() and addLast() methods
87+
arrayDeque.addFirst("Grapes");
88+
arrayDeque.addLast("Honeydew");
89+
90+
System.out.println("ArrayDeque after addFirst() and addLast(): " + arrayDeque);
91+
92+
// Use the offerFirst() and offerLast() methods
93+
arrayDeque.offerFirst("Indian Fig");
94+
arrayDeque.offerLast("Jackfruit");
95+
96+
System.out.println("ArrayDeque after offerFirst() and offerLast(): " + arrayDeque);
97+
98+
// Peek the first and last elements using peekFirst() and peekLast()
99+
System.out.println("First element using peekFirst(): " + arrayDeque.peekFirst());
100+
System.out.println("Last element using peekLast(): " + arrayDeque.peekLast());
101+
102+
// Remove the first and last elements using removeFirst() and removeLast()
103+
System.out.println("Removed first element using removeFirst(): " + arrayDeque.removeFirst());
104+
System.out.println("Removed last element using removeLast(): " + arrayDeque.removeLast());
105+
106+
System.out.println("ArrayDeque after removing first and last elements: " + arrayDeque);
107+
System.out.println(); // Empty line for better readability
108+
}
109+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# `ArrayDeque` in Java
2+
3+
## Overview
4+
5+
The `ArrayDeque` class in Java is a part of the `java.util` package and implements the `Deque` interface. It provides a resizable array-based implementation of a double-ended queue, allowing elements to be added or removed from both ends efficiently.
6+
7+
---
8+
9+
## Characteristics of `ArrayDeque`
10+
11+
| **Feature** | **Details** |
12+
|--------------------------|-----------------------------------------------|
13+
| **Package** | `java.util` |
14+
| **Allows Duplicates** | Yes |
15+
| **Ordering** | FIFO (First In, First Out) or LIFO (Last In, First Out) depending on usage |
16+
| **Thread-Safe** | No |
17+
| **Initial Capacity** | 16 (default) |
18+
19+
---
20+
21+
## Key Features of `ArrayDeque`
22+
23+
- **Double-Ended Queue**: Allows insertion and removal of elements from both ends of the queue.
24+
- **Efficient Operations**: All operations (add, remove) are done in constant time (`O(1)`).
25+
- **Resizable Array**: The underlying array dynamically grows or shrinks as needed.
26+
- **Not Synchronized**: Unlike `LinkedList`, `ArrayDeque` is not thread-safe.
27+
- **No Capacity Limitation**: The deque grows as needed, with no fixed size.
28+
29+
---
30+
31+
## How to Use `ArrayDeque`
32+
33+
### Importing `ArrayDeque`
34+
35+
```java
36+
import java.util.ArrayDeque;
37+
```
38+
39+
### Creating an `ArrayDeque`
40+
41+
```java
42+
ArrayDeque<Type> arrayDeque = new ArrayDeque<>();
43+
```
44+
45+
- Example
46+
47+
```java
48+
ArrayDeque<Integer> integerDeque = new ArrayDeque<>();
49+
ArrayDeque<String> stringDeque = new ArrayDeque<>();
50+
```
51+
52+
---
53+
54+
## `ArrayDeque` Specific Methods
55+
The `ArrayDeque` class provides additional methods beyond those in the `Queue` and `Deque` interfaces. Here are some commonly used ones:
56+
57+
| Method | Description | Return Type | Example |
58+
|-------------------|----------------------------------------------------------------------------------------------|-------------|------------------------------------------------|
59+
| addFirst() | Inserts the specified element at the front of the deque. | void | `arrayDeque.addFirst(10);` |
60+
| addLast() | Inserts the specified element at the end of the deque. | void | `arrayDeque.addLast(20);` |
61+
| offerFirst() | Inserts the specified element at the front of the deque, returning true if successful. | boolean | `boolean added = arrayDeque.offerFirst(30);` |
62+
| offerLast() | Inserts the specified element at the end of the deque, returning true if successful. | boolean | `boolean added = arrayDeque.offerLast(40);` |
63+
| peekFirst() | Retrieves, but does not remove, the first element of the deque, or returns null if empty. | Type | `Type first = arrayDeque.peekFirst();` |
64+
| peekLast() | Retrieves, but does not remove, the last element of the deque, or returns null if empty. | Type | `Type last = arrayDeque.peekLast();` |
65+
| pollFirst() | Retrieves and removes the first element of the deque, or returns null if empty. | Type | `Type first = arrayDeque.pollFirst();` |
66+
| pollLast() | Retrieves and removes the last element of the deque, or returns null if empty. | Type | `Type last = arrayDeque.pollLast();` |
67+
| removeFirst() | Removes and returns the first element of the deque. | Type | `Type first = arrayDeque.removeFirst();` |
68+
| removeLast() | Removes and returns the last element of the deque. | Type | `Type last = arrayDeque.removeLast();` |
69+
70+
---
71+
72+
## Example Code
73+
74+
```java
75+
import java.util.ArrayDeque;
76+
77+
public class ArrayDequeExample {
78+
public static void main(String[] args) {
79+
// Create an ArrayDeque
80+
ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
81+
82+
// Add elements
83+
arrayDeque.addFirst(10);
84+
arrayDeque.addLast(20);
85+
arrayDeque.addFirst(30);
86+
87+
// Peek at the first and last elements
88+
System.out.println("First element: " + arrayDeque.peekFirst());
89+
System.out.println("Last element: " + arrayDeque.peekLast());
90+
91+
// Remove elements
92+
System.out.println("Removed first element: " + arrayDeque.pollFirst());
93+
System.out.println("Removed last element: " + arrayDeque.pollLast());
94+
95+
// Display the remaining elements
96+
System.out.println("Remaining elements: " + arrayDeque);
97+
}
98+
}
99+
```
100+
101+
> **For more:** [`ArrayDequeDataStructure.java`](./ArrayDequeDataStructure.java)
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import java.util.*;
2+
3+
public class DequeInterface {
4+
public static void main(String[] args) {
5+
// Create a deque
6+
Deque<String> deque = new LinkedList<>();
7+
8+
// Demonstrate basic operations
9+
demonstrateBasicOperations(deque);
10+
11+
// Demonstrate advanced operations
12+
demonstrateAdvancedOperations(deque);
13+
14+
// Demonstrate additional operations
15+
demonstrateAllMethods(deque);
16+
}
17+
18+
private static void demonstrateBasicOperations(Deque<String> deque) {
19+
System.out.println("Basic Deque Operations:");
20+
21+
// Add elements at the end
22+
deque.offerLast("Apple");
23+
deque.offerLast("Banana");
24+
deque.offerLast("Cherry");
25+
26+
// Peek at the front element
27+
System.out.println("Front element (peekFirst): " + deque.peekFirst());
28+
29+
// Peek at the last element
30+
System.out.println("Last element (peekLast): " + deque.peekLast());
31+
32+
// Check size
33+
System.out.println("Size of the deque: " + deque.size());
34+
35+
// Remove an element from the front
36+
System.out.println("Removed element (pollFirst): " + deque.pollFirst());
37+
38+
// Remove an element from the end
39+
System.out.println("Removed element (pollLast): " + deque.pollLast());
40+
41+
// Check if an element exists
42+
System.out.println("Contains 'Banana': " + deque.contains("Banana"));
43+
44+
// Iterate over elements
45+
System.out.println("Deque elements:");
46+
for (String fruit : deque) {
47+
System.out.println(fruit);
48+
}
49+
50+
// Clear the deque
51+
deque.clear();
52+
System.out.println("Is deque empty? " + deque.isEmpty());
53+
System.out.println(); // Empty line for better readability
54+
}
55+
56+
private static void demonstrateAdvancedOperations(Deque<String> deque) {
57+
System.out.println("Advanced Deque Operations:");
58+
59+
// Add elements again for demonstration
60+
deque.offerLast("Apple");
61+
deque.offerLast("Banana");
62+
deque.offerLast("Cherry");
63+
deque.offerLast("Date");
64+
65+
// Using forEach to iterate
66+
System.out.println("Deque elements (using forEach):");
67+
deque.forEach(System.out::println);
68+
69+
// Using an iterator
70+
System.out.println("Deque elements (using iterator):");
71+
Iterator<String> iterator = deque.iterator();
72+
while (iterator.hasNext()) {
73+
System.out.println(iterator.next());
74+
}
75+
76+
// Using descending iterator
77+
System.out.println("Deque elements (using descending iterator):");
78+
Iterator<String> descendingIterator = deque.descendingIterator();
79+
while (descendingIterator.hasNext()) {
80+
System.out.println(descendingIterator.next());
81+
}
82+
83+
// Access head and tail without removal
84+
System.out.println("Head element (getFirst): " + deque.getFirst());
85+
System.out.println("Tail element (getLast): " + deque.getLast());
86+
87+
// Remove elements using removeFirst and removeLast
88+
try {
89+
while (!deque.isEmpty()) {
90+
System.out.println("Removed from front (removeFirst): " + deque.removeFirst());
91+
if (!deque.isEmpty()) {
92+
System.out.println("Removed from end (removeLast): " + deque.removeLast());
93+
}
94+
}
95+
} catch (NoSuchElementException e) {
96+
System.out.println("Deque is empty!");
97+
}
98+
99+
System.out.println("Is deque empty after removing all elements? " + deque.isEmpty());
100+
System.out.println(); // Empty line for better readability
101+
}
102+
103+
private static void demonstrateAllMethods(Deque<String> deque) {
104+
System.out.println("Demonstrating All Methods:");
105+
106+
// Add elements at both ends
107+
deque.addFirst("Mango");
108+
deque.addLast("Pineapple");
109+
110+
// Convert to array
111+
Object[] array = deque.toArray();
112+
System.out.println("Deque as array: " + Arrays.toString(array));
113+
114+
// Remove specific elements
115+
deque.remove("Mango");
116+
System.out.println("After removing 'Mango': " + deque);
117+
118+
// Clear and check isEmpty
119+
deque.clear();
120+
System.out.println("Cleared deque. Is empty? " + deque.isEmpty());
121+
System.out.println(); // Empty line for better readability
122+
}
123+
}

0 commit comments

Comments
 (0)