Skip to content

Commit 445895c

Browse files
committed
Add QueueByTwoStacks.java new algorithm
1 parent f34fe4d commit 445895c

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.thealgorithms.datastructures.queues;
2+
3+
import java.util.Stack;
4+
import java.util.NoSuchElementException;
5+
6+
public class QueueByTwoStacks<T> {
7+
8+
private Stack<T> enqueueStk;
9+
private Stack<T> dequeueStk;
10+
11+
// Constructor initializes stacks and optionally fills the queue from an iterable
12+
public QueueByTwoStacks() {
13+
enqueueStk = new Stack<>();
14+
dequeueStk = new Stack<>();
15+
}
16+
17+
// Add an item to the queue
18+
public void put(T item) {
19+
enqueueStk.push(item);
20+
}
21+
22+
// Remove and return the first item from the queue
23+
public T get() {
24+
if (dequeueStk.isEmpty()) {
25+
while (!enqueueStk.isEmpty()) {
26+
dequeueStk.push(enqueueStk.pop());
27+
}
28+
}
29+
if (dequeueStk.isEmpty()) {
30+
throw new NoSuchElementException("Queue is empty");
31+
}
32+
return dequeueStk.pop();
33+
}
34+
35+
// Get the number of elements in the queue
36+
public int size() {
37+
return enqueueStk.size() + dequeueStk.size();
38+
}
39+
40+
// Return string representation of the queue
41+
@Override
42+
public String toString() {
43+
Stack<T> tempStack = (Stack<T>) dequeueStk.clone();
44+
while (!enqueueStk.isEmpty()) {
45+
tempStack.push(enqueueStk.pop());
46+
}
47+
return "Queue(" + tempStack + ")";
48+
}
49+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.thealgorithms.datastructures.queues;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import java.util.NoSuchElementException;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
public class QueueByTwoStacksTest {
11+
12+
private QueueByTwoStacks<Integer> queue;
13+
14+
@BeforeEach
15+
public void setUp() {
16+
queue = new QueueByTwoStacks<>();
17+
}
18+
19+
@Test
20+
public void testEmptyQueue() {
21+
assertEquals(0, queue.size());
22+
}
23+
24+
@Test
25+
public void testEnqueue() {
26+
queue.put(10);
27+
queue.put(20);
28+
assertEquals(2, queue.size());
29+
}
30+
31+
@Test
32+
public void testDequeue() {
33+
queue.put(10);
34+
queue.put(20);
35+
queue.put(30);
36+
assertEquals(10, queue.get()); // First item out
37+
assertEquals(20, queue.get()); // Second item out
38+
assertEquals(30, queue.get()); // Third item out
39+
}
40+
41+
@Test
42+
public void testInterleavedOperations() {
43+
queue.put(10);
44+
queue.put(20);
45+
assertEquals(10, queue.get()); // Dequeue first item
46+
queue.put(30);
47+
assertEquals(20, queue.get()); // Dequeue second item
48+
assertEquals(30, queue.get()); // Dequeue third item
49+
}
50+
51+
@Test
52+
public void testQueueSize() {
53+
assertEquals(0, queue.size());
54+
queue.put(1);
55+
assertEquals(1, queue.size());
56+
queue.put(2);
57+
queue.put(3);
58+
assertEquals(3, queue.size());
59+
queue.get();
60+
assertEquals(2, queue.size());
61+
}
62+
63+
@Test
64+
public void testEmptyQueueException() {
65+
assertThrows(NoSuchElementException.class, () -> {
66+
queue.get(); // Attempting to dequeue from empty queue
67+
});
68+
}
69+
}

0 commit comments

Comments
 (0)