Skip to content

Commit 94011f3

Browse files
feat: implement queue data structure class
1 parent 291ff99 commit 94011f3

File tree

5 files changed

+155
-0
lines changed

5 files changed

+155
-0
lines changed

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ import './hash-table/HashTable';
44
import './linked-list/LinkedList';
55
import './doubly-linked-list/DoublyLinkedList';
66
import './stack/StackClass';
7+
import './queue/QueueClass';

src/queue/QueueClass.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { QueueNode } from './QueueNode';
2+
3+
export interface Queue<T> {
4+
size: number;
5+
first: QueueNode<T> | null;
6+
last: QueueNode<T> | null;
7+
peek(): QueueNode<T> | null;
8+
enqueue(value: T): QueueNode<T> | null;
9+
dequeue(): QueueNode<T> | null;
10+
isEmpty(): boolean;
11+
}
12+
13+
export class Queue<T> implements Queue<T> {
14+
constructor() {
15+
this.first = null;
16+
this.last = null;
17+
this.size = 0;
18+
}
19+
20+
public peek(): QueueNode<T> {
21+
if (this.isEmpty()) {
22+
throw new Error('Queue is empty');
23+
}
24+
return this.first;
25+
}
26+
27+
public isEmpty() {
28+
return this.size === 0;
29+
}
30+
31+
public enqueue(value: T): QueueNode<T> {
32+
const node = new QueueNode(value);
33+
if (this.size === 0) {
34+
this.first = node;
35+
this.last = node;
36+
} else {
37+
this.last.next = node;
38+
this.last = node;
39+
}
40+
this.size += 1;
41+
return this.first;
42+
}
43+
44+
public dequeue(): QueueNode<T> {
45+
if (this.size > 0) {
46+
const nodeToBeRemoved = this.first;
47+
this.first = this.first.next;
48+
this.size--;
49+
nodeToBeRemoved.next = null;
50+
return nodeToBeRemoved;
51+
}
52+
return null;
53+
}
54+
}

src/queue/QueueNode.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export interface QueueNode<T> {
2+
data: T | null;
3+
next: QueueNode<T> | null;
4+
}
5+
6+
export class QueueNode<T> implements QueueNode<T> {
7+
constructor(data?: T) {
8+
this.data = data;
9+
this.next = null;
10+
}
11+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { Queue } from '../QueueClass';
2+
3+
describe('Queue', () => {
4+
test('create an empty queue', () => {
5+
const queue = new Queue();
6+
7+
expect(queue).toBeInstanceOf(Queue);
8+
expect(queue).not.toBeNull();
9+
expect(queue.isEmpty()).toBeTruthy();
10+
});
11+
12+
test('enqueue data to queue', () => {
13+
const queue = new Queue<string>();
14+
15+
queue.enqueue('Joy');
16+
queue.enqueue('Matt');
17+
queue.enqueue('Pavel');
18+
queue.enqueue('Samir');
19+
20+
expect(queue.size).toBe(4);
21+
expect(queue.isEmpty()).toBeFalsy();
22+
});
23+
24+
test('dequeue data from queue', () => {
25+
const queue = new Queue<string>();
26+
27+
queue.enqueue('Joy');
28+
queue.enqueue('Matt');
29+
queue.enqueue('Pavel');
30+
queue.enqueue('Samir');
31+
32+
expect(queue.size).toBe(4);
33+
expect(queue.isEmpty()).toBeFalsy();
34+
35+
expect(queue.dequeue().data).toBe('Joy');
36+
expect(queue.dequeue().data).toBe('Matt');
37+
38+
expect(queue.size).toBe(2);
39+
expect(queue.isEmpty()).toBeFalsy();
40+
});
41+
42+
test('peek node from queue', () => {
43+
const queue = new Queue<number>();
44+
45+
queue.enqueue(1);
46+
queue.enqueue(2);
47+
queue.enqueue(3);
48+
49+
expect(queue.peek().data).toBe(1);
50+
});
51+
52+
test('peek throws error if queue is empty', () => {
53+
try {
54+
const queue = new Queue();
55+
56+
expect(queue.peek()).toThrowError();
57+
} catch (error) {
58+
expect(error).toBeInstanceOf(Error);
59+
expect(error).toHaveProperty('message', 'Queue is empty');
60+
}
61+
});
62+
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { QueueNode } from '../QueueNode';
2+
3+
describe('Stack Node', () => {
4+
test('create empty queue node', () => {
5+
const node = new QueueNode();
6+
7+
expect(node.data).toBeUndefined();
8+
expect(node.next).toBeNull();
9+
expect(node.next).toBeNull();
10+
});
11+
12+
test('create queue node with value', () => {
13+
const node = new QueueNode(10);
14+
15+
expect(node.data).toBe(10);
16+
expect(node.next).toBeNull();
17+
});
18+
19+
test('create queue node with object as a value', () => {
20+
const nodeValue = { key: 1, value: 'test' };
21+
const node = new QueueNode(nodeValue);
22+
23+
expect(node.data.key).toBe(1);
24+
expect(node.data.value).toBe('test');
25+
expect(node.next).toBeNull();
26+
});
27+
});

0 commit comments

Comments
 (0)