-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathqueue.js
More file actions
108 lines (96 loc) · 2.44 KB
/
queue.js
File metadata and controls
108 lines (96 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
console.log('----------queue start--------------');
class Queue {
#storage;
constructor() {
this.#storage = {};
this.length = 0;
this.head = 0;
}
enqueue(value) {
this.#storage[this.length++ + this.head] = value;
}
dequeue() {
if (this.length) {
const value = this.#storage[this.head];
delete this.#storage[this.head];
this.length--;
this.head++;
return value;
} else {
this.head = 0;
return undefined;
}
}
peek() {
return this.#storage[this.head];
}
}
// Test Suite
console.log('Starting Queue Tests');
// Test 1: Queue Initialization
let q = new Queue();
console.assert(q.length === 0, 'Queue should be initialized with length 0.');
// Test 2: Enqueue Functionality
q.enqueue(1);
console.log(
q.length === 1 && q.peek() === 1,
'Queue should contain one element with value 1.'
);
// Test 3: Multiple Enqueues
q.enqueue(2);
q.enqueue(3);
console.log(
q.length === 3 && q.peek() === 1,
'Queue should have 3 elements, with 1 at the head.'
);
// Test 4: Dequeue Functionality
let dequeued = q.dequeue();
console.log(
dequeued === 1 && q.length === 2 && q.peek() === 2,
'Dequeue should remove the head element and return its value.'
);
// Test 5: Dequeue Until Empty
q.dequeue(); // 2
q.dequeue(); // 3 - Queue is now empty
let emptyDequeue = q.dequeue();
console.log(
emptyDequeue === undefined && q.length === 0,
'Dequeue on empty queue should return undefined.'
);
// Test 6: Peek Functionality
q.enqueue(4);
console.log(
q.peek() === 4,
"Peek should return the head element's value without removing it."
);
// Test 7: Peek on Empty Queue
q.dequeue(); // Remove 4, making it empty again
console.log(
q.peek() === undefined,
'Peek on an empty queue should return undefined.'
);
// Test 8: Queue State After Multiple Operations
q.enqueue(5);
q.enqueue(6);
q.dequeue(); // 5
q.enqueue(7);
console.log(
q.peek() === 6 && q.length === 2,
'Queue should correctly reflect operations performed.'
);
q.dequeue();
q.dequeue();
// Test 9: Enqueue and Dequeue Large Numbers
for (let i = 0; i < 1000; i++) {
q.enqueue(i);
}
for (let i = 0; i < 1000; i++) {
q.dequeue();
}
console.log(
q.length === 0,
q,
'Queue should be empty after enqueuing and dequeuing 1000 elements.'
);
console.log('Queue Tests Completed');
console.log('----------queue end--------------');