data-structure-typed 1.48.8 → 1.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +58 -55
- package/README_zh-CN.md +58 -56
- package/benchmark/report.html +1 -46
- package/benchmark/report.json +23 -458
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +8 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +9 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +15 -10
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +55 -49
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +8 -1
- package/dist/cjs/data-structures/binary-tree/bst.js +9 -0
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +10 -16
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +16 -29
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +8 -1
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js +9 -0
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +0 -110
- package/dist/cjs/data-structures/queue/deque.js +1 -172
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +8 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +9 -0
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +15 -10
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +55 -49
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +8 -1
- package/dist/mjs/data-structures/binary-tree/bst.js +9 -0
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +10 -16
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +16 -28
- package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +8 -1
- package/dist/mjs/data-structures/binary-tree/tree-multimap.js +9 -0
- package/dist/mjs/data-structures/queue/deque.d.ts +0 -110
- package/dist/mjs/data-structures/queue/deque.js +0 -170
- package/dist/umd/data-structure-typed.js +94 -239
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +1 -1
- package/src/data-structures/binary-tree/avl-tree.ts +11 -1
- package/src/data-structures/binary-tree/binary-tree.ts +65 -56
- package/src/data-structures/binary-tree/bst.ts +11 -1
- package/src/data-structures/binary-tree/rb-tree.ts +18 -32
- package/src/data-structures/binary-tree/tree-multimap.ts +17 -1
- package/src/data-structures/queue/deque.ts +1 -191
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +15 -8
- package/test/unit/data-structures/binary-tree/bst.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +5 -5
- package/test/unit/data-structures/queue/deque.test.ts +265 -367
- package/test/unit/data-structures/queue/queue.test.ts +158 -158
|
@@ -1,475 +1,373 @@
|
|
|
1
1
|
import { Deque } from '../../../../src';
|
|
2
|
-
import { bigO } from '../../../utils';
|
|
3
2
|
import { isDebugTest } from '../../../config';
|
|
4
3
|
|
|
5
4
|
const isDebug = isDebugTest;
|
|
6
|
-
describe('Deque Tests', () => {
|
|
7
|
-
// Test cases for the Deque class (DoublyLinkedList-based)
|
|
8
|
-
describe('Deque (DoublyLinkedList-based)', () => {
|
|
9
|
-
let deque: Deque<number>;
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
deque = new Deque<number>();
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it('should add elements at the beginning and end', () => {
|
|
16
|
-
deque.addFirst(1);
|
|
17
|
-
deque.addLast(2);
|
|
18
|
-
expect(deque.first).toBe(1);
|
|
19
|
-
expect(deque.last).toBe(2);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('should delete elements from the beginning and end', () => {
|
|
23
|
-
deque.addFirst(1);
|
|
24
|
-
deque.addLast(2);
|
|
25
|
-
deque.pollFirst();
|
|
26
|
-
deque.pollLast();
|
|
27
|
-
expect(deque.isEmpty()).toBe(true);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('should handle edge case when removing from an empty deque', () => {
|
|
31
|
-
const result = deque.pollFirst();
|
|
32
|
-
expect(result).toBeUndefined();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('should correctly report its size', () => {
|
|
36
|
-
deque.addFirst(1);
|
|
37
|
-
deque.addLast(2);
|
|
38
|
-
expect(deque.size).toBe(2);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('should handle adding and removing elements alternately', () => {
|
|
42
|
-
deque.addFirst(1);
|
|
43
|
-
expect(deque.pollFirst()).toBe(1);
|
|
44
|
-
deque.addLast(2);
|
|
45
|
-
expect(deque.pollLast()).toBe(2);
|
|
46
|
-
expect(deque.isEmpty()).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('should handle adding and removing elements in a cyclic manner', () => {
|
|
50
|
-
deque.addFirst(1);
|
|
51
|
-
deque.addLast(2);
|
|
52
|
-
expect(deque.pollFirst()).toBe(1);
|
|
53
|
-
deque.addFirst(3);
|
|
54
|
-
expect(deque.pollLast()).toBe(2);
|
|
55
|
-
expect(deque.size).toBe(1);
|
|
56
|
-
});
|
|
57
|
-
// Add more test cases as needed
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// // Test cases for the ObjectDeque class
|
|
61
|
-
// describe('ObjectDeque', () => {
|
|
62
|
-
// let objectDeque: ObjectDeque<string>;
|
|
63
|
-
//
|
|
64
|
-
// beforeEach(() => {
|
|
65
|
-
// objectDeque = new ObjectDeque<string>();
|
|
66
|
-
// });
|
|
67
|
-
//
|
|
68
|
-
// it('should add elements at the beginning and end', () => {
|
|
69
|
-
// objectDeque.addFirst('one');
|
|
70
|
-
// objectDeque.addLast('two');
|
|
71
|
-
// expect(objectDeque.getFirst()).toBe('one');
|
|
72
|
-
// expect(objectDeque.getLast()).toBe('two');
|
|
73
|
-
// });
|
|
74
|
-
//
|
|
75
|
-
// it('should delete elements from the beginning and end', () => {
|
|
76
|
-
// objectDeque.addFirst('one');
|
|
77
|
-
// objectDeque.addLast('two');
|
|
78
|
-
// objectDeque.pollFirst();
|
|
79
|
-
// objectDeque.pollLast();
|
|
80
|
-
// expect(objectDeque.isEmpty()).toBe(true);
|
|
81
|
-
// });
|
|
82
|
-
//
|
|
83
|
-
// it('should handle edge case when removing from an empty deque', () => {
|
|
84
|
-
// const result = objectDeque.pollFirst();
|
|
85
|
-
// expect(result).toBeUndefined();
|
|
86
|
-
// });
|
|
87
|
-
//
|
|
88
|
-
// it('should correctly report its size', () => {
|
|
89
|
-
// objectDeque.addFirst('one');
|
|
90
|
-
// objectDeque.addLast('two');
|
|
91
|
-
// expect(objectDeque.size).toBe(2);
|
|
92
|
-
// });
|
|
93
|
-
//
|
|
94
|
-
// // Add more test cases as needed
|
|
95
|
-
// });
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
describe('Deque Performance Test', () => {
|
|
99
|
-
const dataSize = 10000;
|
|
100
|
-
it('should numeric queue be efficient', function () {
|
|
101
|
-
const startTime = performance.now();
|
|
102
|
-
const queue = new Deque<number>();
|
|
103
|
-
for (let i = 0; i < dataSize; i++) {
|
|
104
|
-
queue.unshift(i);
|
|
105
|
-
}
|
|
106
|
-
for (let i = 0; i < dataSize; i++) {
|
|
107
|
-
queue.pop();
|
|
108
|
-
}
|
|
109
|
-
isDebug && console.log(`Queue Deque Test: ${performance.now() - startTime} ms`);
|
|
110
|
-
expect(performance.now() - startTime).toBeLessThan(bigO.LINEAR * 100);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
5
|
|
|
114
|
-
describe('Deque', () => {
|
|
6
|
+
describe('Deque - Basic Operations', () => {
|
|
115
7
|
let deque: Deque<number>;
|
|
116
8
|
|
|
117
9
|
beforeEach(() => {
|
|
118
|
-
deque = new Deque<number>();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('should initialize an empty deque', () => {
|
|
122
|
-
expect(deque.size).toBe(0);
|
|
123
|
-
expect(deque.isEmpty()).toBe(true);
|
|
10
|
+
deque = new Deque<number>([1, 2]);
|
|
124
11
|
});
|
|
125
12
|
|
|
126
|
-
|
|
127
|
-
deque.addFirst(1);
|
|
128
|
-
deque.addLast(2);
|
|
129
|
-
|
|
13
|
+
test('push should add elements to the end', () => {
|
|
130
14
|
expect(deque.size).toBe(2);
|
|
131
|
-
expect(deque.first).toBe(1);
|
|
132
15
|
expect(deque.last).toBe(2);
|
|
133
16
|
});
|
|
134
17
|
|
|
135
|
-
|
|
136
|
-
deque.
|
|
137
|
-
deque.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
18
|
+
test('pop should remove elements from the end', () => {
|
|
19
|
+
expect(deque.pop()).toBe(2);
|
|
20
|
+
expect(deque.size).toBe(1);
|
|
21
|
+
expect(deque.pop()).toBe(1);
|
|
22
|
+
expect(deque.isEmpty()).toBeTruthy();
|
|
23
|
+
});
|
|
141
24
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
25
|
+
test('unshift should add elements to the beginning', () => {
|
|
26
|
+
deque.clear();
|
|
27
|
+
deque.unshift(1);
|
|
28
|
+
deque.unshift(2);
|
|
29
|
+
expect(deque.size).toBe(2);
|
|
30
|
+
expect(deque.first).toBe(2);
|
|
145
31
|
});
|
|
146
32
|
|
|
147
|
-
|
|
148
|
-
deque.
|
|
149
|
-
deque.
|
|
150
|
-
deque.
|
|
33
|
+
test('shift should remove elements from the beginning', () => {
|
|
34
|
+
deque.clear();
|
|
35
|
+
deque.unshift(1);
|
|
36
|
+
deque.unshift(2);
|
|
37
|
+
expect(deque.shift()).toBe(2);
|
|
38
|
+
expect(deque.size).toBe(1);
|
|
39
|
+
expect(deque.shift()).toBe(1);
|
|
40
|
+
expect(deque.isEmpty()).toBeTruthy();
|
|
41
|
+
});
|
|
151
42
|
|
|
43
|
+
test('getAt should retrieve the correct element', () => {
|
|
152
44
|
expect(deque.getAt(0)).toBe(1);
|
|
153
45
|
expect(deque.getAt(1)).toBe(2);
|
|
154
|
-
expect(deque.getAt(2)).toBe(3);
|
|
155
46
|
});
|
|
156
47
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
// expect(deque.getAt(-1)).toThrow('Index out of bounds');
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('should check if the deque is empty', () => {
|
|
164
|
-
expect(deque.isEmpty()).toBe(true);
|
|
165
|
-
|
|
166
|
-
deque.addLast(1);
|
|
167
|
-
expect(deque.isEmpty()).toBe(false);
|
|
168
|
-
|
|
169
|
-
deque.pollFirst();
|
|
170
|
-
expect(deque.isEmpty()).toBe(true);
|
|
48
|
+
test('setAt should set the correct element', () => {
|
|
49
|
+
deque.setAt(0, 3);
|
|
50
|
+
expect(deque.getAt(0)).toBe(3);
|
|
171
51
|
});
|
|
172
52
|
});
|
|
173
|
-
|
|
174
|
-
// describe('ObjectDeque', () => {
|
|
175
|
-
// let deque: ObjectDeque<number>;
|
|
176
|
-
//
|
|
177
|
-
// beforeEach(() => {
|
|
178
|
-
// deque = new ObjectDeque<number>();
|
|
179
|
-
// });
|
|
180
|
-
//
|
|
181
|
-
// it('should add elements to the front of the deque', () => {
|
|
182
|
-
// deque.addFirst(1);
|
|
183
|
-
// deque.addFirst(2);
|
|
184
|
-
//
|
|
185
|
-
// expect(deque.size).toBe(2);
|
|
186
|
-
// expect(deque.getFirst()).toBe(2);
|
|
187
|
-
// expect(deque.getLast()).toBe(1);
|
|
188
|
-
// });
|
|
189
|
-
//
|
|
190
|
-
// it('should add elements to the end of the deque', () => {
|
|
191
|
-
// deque.addLast(1);
|
|
192
|
-
// deque.addLast(2);
|
|
193
|
-
//
|
|
194
|
-
// expect(deque.size).toBe(2);
|
|
195
|
-
// expect(deque.getFirst()).toBe(1);
|
|
196
|
-
// expect(deque.getLast()).toBe(2);
|
|
197
|
-
// });
|
|
198
|
-
//
|
|
199
|
-
// it('should remove elements from the front of the deque', () => {
|
|
200
|
-
// deque.addLast(1);
|
|
201
|
-
// deque.addLast(2);
|
|
202
|
-
//
|
|
203
|
-
// const removedElement = deque.pollFirst();
|
|
204
|
-
//
|
|
205
|
-
// expect(deque.size).toBe(1);
|
|
206
|
-
// expect(removedElement).toBe(1);
|
|
207
|
-
// expect(deque.getFirst()).toBe(2);
|
|
208
|
-
// });
|
|
209
|
-
//
|
|
210
|
-
// it('should remove elements from the end of the deque', () => {
|
|
211
|
-
// deque.addLast(1);
|
|
212
|
-
// deque.addLast(2);
|
|
213
|
-
//
|
|
214
|
-
// const removedElement = deque.pollFirst();
|
|
215
|
-
//
|
|
216
|
-
// expect(deque.size).toBe(1);
|
|
217
|
-
// expect(removedElement).toBe(1);
|
|
218
|
-
// expect(deque.getLast()).toBe(2);
|
|
219
|
-
// });
|
|
220
|
-
//
|
|
221
|
-
// it('should return the element at the front of the deque without removing it', () => {
|
|
222
|
-
// deque.addFirst(1);
|
|
223
|
-
// deque.addFirst(2);
|
|
224
|
-
//
|
|
225
|
-
// expect(deque.getFirst()).toBe(2);
|
|
226
|
-
// expect(deque.size).toBe(2);
|
|
227
|
-
// });
|
|
228
|
-
//
|
|
229
|
-
// it('should return the element at the end of the deque without removing it', () => {
|
|
230
|
-
// deque.addLast(1);
|
|
231
|
-
// deque.addLast(2);
|
|
232
|
-
//
|
|
233
|
-
// expect(deque.getLast()).toBe(2);
|
|
234
|
-
// expect(deque.size).toBe(2);
|
|
235
|
-
// });
|
|
236
|
-
//
|
|
237
|
-
// it('should return the correct size of the deque', () => {
|
|
238
|
-
// deque.addFirst(1);
|
|
239
|
-
// deque.addLast(2);
|
|
240
|
-
// deque.addLast(3);
|
|
241
|
-
//
|
|
242
|
-
// expect(deque.size).toBe(3);
|
|
243
|
-
// });
|
|
244
|
-
//
|
|
245
|
-
// it('should check if the deque is empty', () => {
|
|
246
|
-
// expect(deque.isEmpty()).toBe(true);
|
|
247
|
-
//
|
|
248
|
-
// deque.addFirst(1);
|
|
249
|
-
//
|
|
250
|
-
// expect(deque.isEmpty()).toBe(false);
|
|
251
|
-
// });
|
|
252
|
-
//
|
|
253
|
-
// it('should set elements at a specific index', () => {
|
|
254
|
-
// deque.addFirst(1);
|
|
255
|
-
// deque.addLast(2);
|
|
256
|
-
// deque.addLast(3);
|
|
257
|
-
//
|
|
258
|
-
// expect(deque.getFirst()).toBe(1);
|
|
259
|
-
// expect(deque.get(1)).toBe(2);
|
|
260
|
-
// expect(deque.getLast()).toBe(3);
|
|
261
|
-
// });
|
|
262
|
-
//
|
|
263
|
-
// it('should insert elements at a specific index', () => {
|
|
264
|
-
// deque.addFirst(1);
|
|
265
|
-
// deque.addLast(2);
|
|
266
|
-
// deque.addLast(3);
|
|
267
|
-
//
|
|
268
|
-
// expect(deque.size).toBe(3);
|
|
269
|
-
// expect(deque.getFirst()).toBe(1);
|
|
270
|
-
// expect(deque.get(1)).toBe(2);
|
|
271
|
-
// expect(deque.get(2)).toBe(3);
|
|
272
|
-
// expect(deque.getLast()).toBe(3);
|
|
273
|
-
// });
|
|
274
|
-
// });
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
describe('Deque', () => {
|
|
53
|
+
describe('Deque - Complex Operations', () => {
|
|
278
54
|
let deque: Deque<number>;
|
|
279
55
|
|
|
280
56
|
beforeEach(() => {
|
|
281
57
|
deque = new Deque<number>();
|
|
282
58
|
});
|
|
283
59
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
// const customDeque = new Deque(20);
|
|
290
|
-
// expect(customDeque.capacity).toBe(20);
|
|
291
|
-
// });
|
|
292
|
-
|
|
293
|
-
test('is initially empty', () => {
|
|
294
|
-
expect(deque.isEmpty()).toBe(true);
|
|
60
|
+
test('insertAt should insert elements at the specified position', () => {
|
|
61
|
+
deque.push(1);
|
|
62
|
+
deque.push(3);
|
|
63
|
+
deque.insertAt(1, 2);
|
|
64
|
+
expect(deque.toArray()).toEqual([1, 2, 3]);
|
|
295
65
|
});
|
|
296
66
|
|
|
297
|
-
test('
|
|
67
|
+
test('cut should remove elements after the specified position', () => {
|
|
298
68
|
deque.push(1);
|
|
299
69
|
deque.push(2);
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
expect(deque.
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
test('unshifts and shifts elements', () => {
|
|
306
|
-
deque.unshift(1);
|
|
307
|
-
deque.unshift(2);
|
|
308
|
-
expect(deque.shift()).toBe(2);
|
|
309
|
-
expect(deque.shift()).toBe(1);
|
|
310
|
-
expect(deque.shift()).toBeUndefined();
|
|
70
|
+
deque.push(3);
|
|
71
|
+
deque.cut(1);
|
|
72
|
+
expect(deque.toArray()).toEqual([1, 2]);
|
|
311
73
|
});
|
|
312
74
|
|
|
313
|
-
test('
|
|
314
|
-
expect(deque.size).toBe(0);
|
|
75
|
+
test('deleteAt should remove the element at the specified position', () => {
|
|
315
76
|
deque.push(1);
|
|
316
77
|
deque.push(2);
|
|
317
|
-
|
|
78
|
+
deque.push(3);
|
|
79
|
+
deque.deleteAt(1);
|
|
80
|
+
expect(deque.toArray()).toEqual([1, 3]);
|
|
318
81
|
});
|
|
319
82
|
|
|
320
|
-
test('
|
|
83
|
+
test('delete should remove all instances of an element', () => {
|
|
321
84
|
deque.push(1);
|
|
322
85
|
deque.push(2);
|
|
86
|
+
deque.push(2);
|
|
323
87
|
deque.push(3);
|
|
324
|
-
|
|
325
|
-
expect(deque.
|
|
88
|
+
deque.delete(2);
|
|
89
|
+
expect(deque.toArray()).toEqual([1, 3]);
|
|
326
90
|
});
|
|
327
91
|
|
|
328
|
-
test('
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
92
|
+
test('reverse should reverse the order of elements', () => {
|
|
93
|
+
deque.push(1);
|
|
94
|
+
deque.push(2);
|
|
95
|
+
deque.push(3);
|
|
96
|
+
deque.reverse();
|
|
97
|
+
expect(deque.toArray()).toEqual([3, 2, 1]);
|
|
334
98
|
});
|
|
335
99
|
|
|
336
|
-
test('
|
|
100
|
+
test('unique should remove duplicate elements', () => {
|
|
337
101
|
deque.push(1);
|
|
338
102
|
deque.push(2);
|
|
103
|
+
deque.push(2);
|
|
339
104
|
deque.push(3);
|
|
105
|
+
deque.unique();
|
|
340
106
|
expect(deque.toArray()).toEqual([1, 2, 3]);
|
|
341
107
|
});
|
|
342
108
|
|
|
343
|
-
test('
|
|
109
|
+
test('sort should sort elements according to a comparator', () => {
|
|
110
|
+
deque.push(3);
|
|
344
111
|
deque.push(1);
|
|
345
112
|
deque.push(2);
|
|
346
|
-
deque.
|
|
347
|
-
expect(deque.
|
|
113
|
+
deque.sort((a, b) => a - b);
|
|
114
|
+
expect(deque.toArray()).toEqual([1, 2, 3]);
|
|
348
115
|
});
|
|
349
116
|
|
|
350
|
-
test('
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
117
|
+
test('shrinkToFit should reduce the memory footprint', () => {
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('Deque - Utility Operations', () => {
|
|
121
|
+
let deque: Deque<number>;
|
|
122
|
+
|
|
123
|
+
beforeEach(() => {
|
|
124
|
+
deque = new Deque<number>();
|
|
357
125
|
});
|
|
358
126
|
|
|
359
|
-
test('
|
|
127
|
+
test('find should return the first element that matches the condition', () => {
|
|
360
128
|
deque.push(1);
|
|
361
129
|
deque.push(2);
|
|
362
130
|
deque.push(3);
|
|
363
|
-
|
|
131
|
+
const found = deque.find(element => element > 1);
|
|
132
|
+
expect(found).toBe(2);
|
|
364
133
|
});
|
|
365
134
|
|
|
366
|
-
test('
|
|
135
|
+
test('indexOf should return the index of the first occurrence of an element', () => {
|
|
367
136
|
deque.push(1);
|
|
368
137
|
deque.push(2);
|
|
369
|
-
|
|
370
|
-
deque.
|
|
371
|
-
|
|
372
|
-
});
|
|
373
|
-
expect(sum).toBe(3);
|
|
138
|
+
deque.push(3);
|
|
139
|
+
const index = deque.indexOf(2);
|
|
140
|
+
expect(index).toBe(1);
|
|
374
141
|
});
|
|
375
142
|
|
|
376
|
-
test('
|
|
143
|
+
test('toArray should convert the deque to an array', () => {
|
|
377
144
|
deque.push(1);
|
|
378
145
|
deque.push(2);
|
|
379
|
-
|
|
380
|
-
expect(
|
|
146
|
+
deque.push(3);
|
|
147
|
+
expect(deque.toArray()).toEqual([1, 2, 3]);
|
|
381
148
|
});
|
|
382
149
|
|
|
383
|
-
test('
|
|
150
|
+
test('filter should filter elements based on a predicate', () => {
|
|
384
151
|
deque.push(1);
|
|
385
152
|
deque.push(2);
|
|
386
153
|
deque.push(3);
|
|
387
|
-
const
|
|
388
|
-
expect(
|
|
154
|
+
const filtered = deque.filter(element => element > 1);
|
|
155
|
+
expect(filtered.toArray()).toEqual([2, 3]);
|
|
389
156
|
});
|
|
390
157
|
|
|
391
|
-
test('
|
|
158
|
+
test('map should apply a function to all elements', () => {
|
|
392
159
|
deque.push(1);
|
|
393
160
|
deque.push(2);
|
|
394
161
|
deque.push(3);
|
|
395
|
-
const
|
|
396
|
-
expect(
|
|
162
|
+
const mapped = deque.map(element => element * 2);
|
|
163
|
+
expect(mapped.toArray()).toEqual([2, 4, 6]);
|
|
397
164
|
});
|
|
398
165
|
|
|
399
|
-
test('
|
|
166
|
+
test('print should print the deque elements', () => {
|
|
167
|
+
const consoleSpy = jest.spyOn(console, 'log');
|
|
400
168
|
deque.push(1);
|
|
401
169
|
deque.push(2);
|
|
402
|
-
deque.
|
|
403
|
-
|
|
404
|
-
expect(deque.toArray()).toEqual([3, 2, 1]);
|
|
170
|
+
deque.print();
|
|
171
|
+
expect(consoleSpy).toHaveBeenCalledWith([1, 2]);
|
|
405
172
|
});
|
|
406
173
|
|
|
407
|
-
|
|
174
|
+
});
|
|
175
|
+
describe('Deque - Additional Operations', () => {
|
|
176
|
+
let deque: Deque<number>;
|
|
177
|
+
|
|
178
|
+
beforeEach(() => {
|
|
179
|
+
deque = new Deque<number>();
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
test('addLast should add an element to the end', () => {
|
|
183
|
+
deque.addLast(1);
|
|
184
|
+
deque.addLast(2);
|
|
185
|
+
expect(deque.last).toBe(2);
|
|
186
|
+
expect(deque.size).toBe(2);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test('pollLast should remove and return the last element', () => {
|
|
190
|
+
deque.addLast(1);
|
|
191
|
+
deque.addLast(2);
|
|
192
|
+
expect(deque.pollLast()).toBe(2);
|
|
193
|
+
expect(deque.size).toBe(1);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test('addFirst should add an element to the beginning', () => {
|
|
197
|
+
deque.addFirst(1);
|
|
198
|
+
deque.addFirst(2);
|
|
199
|
+
expect(deque.first).toBe(2);
|
|
200
|
+
expect(deque.size).toBe(2);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('pollFirst should remove and return the first element', () => {
|
|
204
|
+
deque.addFirst(1);
|
|
205
|
+
deque.addFirst(2);
|
|
206
|
+
expect(deque.pollFirst()).toBe(2);
|
|
207
|
+
expect(deque.size).toBe(1);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('clear should reset the deque', () => {
|
|
211
|
+
deque.addFirst(1);
|
|
212
|
+
deque.clear();
|
|
213
|
+
expect(deque.size).toBe(0);
|
|
214
|
+
expect(deque.isEmpty()).toBeTruthy();
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test('begin should yield elements from the beginning', () => {
|
|
218
|
+
deque.addLast(1);
|
|
219
|
+
deque.addLast(2);
|
|
220
|
+
const iterator = deque.begin();
|
|
221
|
+
expect(iterator.next().value).toBe(1);
|
|
222
|
+
expect(iterator.next().value).toBe(2);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test('reverseBegin should yield elements in reverse order', () => {
|
|
226
|
+
deque.addLast(1);
|
|
227
|
+
deque.addLast(2);
|
|
228
|
+
const iterator = deque.reverseBegin();
|
|
229
|
+
expect(iterator.next().value).toBe(2);
|
|
230
|
+
expect(iterator.next().value).toBe(1);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
});
|
|
234
|
+
describe('Deque - push Method', () => {
|
|
235
|
+
let deque: Deque<number>;
|
|
236
|
+
const bucketSize = 10; // 假设的 bucket 大小
|
|
237
|
+
|
|
238
|
+
beforeEach(() => {
|
|
239
|
+
deque = new Deque<number>([], bucketSize);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('push should add an element when deque is empty', () => {
|
|
408
243
|
deque.push(1);
|
|
409
|
-
deque.
|
|
410
|
-
deque.
|
|
411
|
-
|
|
412
|
-
|
|
244
|
+
expect(deque.last).toBe(1);
|
|
245
|
+
expect(deque.size).toBe(1);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test('push should add an element when lastInBucket is not at max', () => {
|
|
249
|
+
for (let i = 0; i < bucketSize - 1; i++) {
|
|
250
|
+
deque.push(i);
|
|
251
|
+
}
|
|
252
|
+
deque.push(bucketSize);
|
|
253
|
+
expect(deque.last).toBe(bucketSize);
|
|
254
|
+
expect(deque.size).toBe(bucketSize);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test('push should add an element and move to next bucket when last bucket is full', () => {
|
|
258
|
+
for (let i = 0; i < bucketSize; i++) {
|
|
259
|
+
deque.push(i);
|
|
260
|
+
}
|
|
261
|
+
deque.push(bucketSize + 1);
|
|
262
|
+
expect(deque.last).toBe(bucketSize + 1);
|
|
263
|
+
expect(deque.size).toBe(bucketSize + 1);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
test('push should add an element and reallocate when last bucket and lastInBucket are at max', () => {
|
|
267
|
+
|
|
268
|
+
for (let i = 0; i < 100; i++) {
|
|
269
|
+
deque.push(i);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
deque.push(100);
|
|
273
|
+
expect(deque.last).toBe(100);
|
|
274
|
+
expect(deque.size).toBeGreaterThan(bucketSize);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('Deque - pop Method', () => {
|
|
278
|
+
let deque: Deque<number>;
|
|
279
|
+
const bucketSize = 10;
|
|
280
|
+
|
|
281
|
+
beforeEach(() => {
|
|
282
|
+
deque = new Deque<number>([], bucketSize);
|
|
413
283
|
});
|
|
414
284
|
|
|
415
|
-
test('
|
|
285
|
+
test('pop should remove and return the last element', () => {
|
|
416
286
|
deque.push(1);
|
|
417
287
|
deque.push(2);
|
|
418
|
-
deque.
|
|
419
|
-
expect(deque.
|
|
420
|
-
expect(deque.indexOf(4)).toBe(-1);
|
|
288
|
+
expect(deque.pop()).toBe(2);
|
|
289
|
+
expect(deque.size).toBe(1);
|
|
421
290
|
});
|
|
422
291
|
|
|
292
|
+
test('pop should handle popping the only element', () => {
|
|
293
|
+
deque.push(1);
|
|
294
|
+
expect(deque.pop()).toBe(1);
|
|
295
|
+
expect(deque.isEmpty()).toBeTruthy();
|
|
296
|
+
});
|
|
423
297
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
deque.
|
|
298
|
+
test('pop should adjust bucketLast and lastInBucket correctly', () => {
|
|
299
|
+
for (let i = 0; i < 100; i++) {
|
|
300
|
+
deque.push(i);
|
|
301
|
+
}
|
|
302
|
+
for (let i = 0; i < 1001; i++) {
|
|
303
|
+
const lastElement = deque.last;
|
|
304
|
+
expect(deque.pop()).toBe(lastElement);
|
|
305
|
+
}
|
|
430
306
|
|
|
431
|
-
const iterator = deque.begin();
|
|
432
307
|
|
|
433
|
-
expect(iterator.next().value).toBe(1);
|
|
434
|
-
});
|
|
435
308
|
});
|
|
309
|
+
});
|
|
310
|
+
describe('Deque - unshift Method', () => {
|
|
311
|
+
let deque: Deque<number>;
|
|
312
|
+
const bucketSize = 10;
|
|
436
313
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
deque.push(1);
|
|
441
|
-
deque.push(2);
|
|
442
|
-
deque.push(3);
|
|
314
|
+
beforeEach(() => {
|
|
315
|
+
deque = new Deque<number>([], bucketSize);
|
|
316
|
+
});
|
|
443
317
|
|
|
444
|
-
|
|
318
|
+
test('unshift should add an element to the beginning when deque is empty', () => {
|
|
319
|
+
deque.unshift(1);
|
|
320
|
+
expect(deque.first).toBe(1);
|
|
321
|
+
expect(deque.size).toBe(1);
|
|
322
|
+
});
|
|
445
323
|
|
|
446
|
-
|
|
447
|
-
|
|
324
|
+
test('unshift should add an element to the beginning and adjust firstInBucket', () => {
|
|
325
|
+
for (let i = 0; i < 100; i++) {
|
|
326
|
+
deque.unshift(i);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
deque.unshift(0);
|
|
330
|
+
expect(deque.first).toBe(0);
|
|
448
331
|
});
|
|
449
332
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
deque.
|
|
453
|
-
|
|
454
|
-
|
|
333
|
+
test('unshift should add an element and reallocate when needed', () => {
|
|
334
|
+
for (let i = 0; i < 100; i++) {
|
|
335
|
+
deque.unshift(i);
|
|
336
|
+
}
|
|
337
|
+
deque.unshift(-1);
|
|
338
|
+
expect(deque.first).toBe(-1);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe('Deque - shift Method', () => {
|
|
342
|
+
let deque: Deque<number>;
|
|
455
343
|
|
|
456
|
-
|
|
457
|
-
deque.forEach((element) => {
|
|
458
|
-
mockCallback(element);
|
|
459
|
-
});
|
|
344
|
+
const bucketSize = 10;
|
|
460
345
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
expect(mockCallback.mock.calls[2]).toEqual([3]);
|
|
346
|
+
beforeEach(() => {
|
|
347
|
+
deque = new Deque<number>([], bucketSize);
|
|
348
|
+
});
|
|
465
349
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
350
|
+
test('shift should remove and return the first element', () => {
|
|
351
|
+
deque.push(1);
|
|
352
|
+
deque.push(2);
|
|
353
|
+
expect(deque.shift()).toBe(1);
|
|
354
|
+
expect(deque.size).toBe(1);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test('shift should handle shifting the only element', () => {
|
|
358
|
+
deque.push(1);
|
|
359
|
+
expect(deque.shift()).toBe(1);
|
|
360
|
+
expect(deque.isEmpty()).toBeTruthy();
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
test('shift should adjust bucketFirst and firstInBucket correctly', () => {
|
|
364
|
+
for (let i = 0; i < 100; i++) {
|
|
365
|
+
deque.push(i);
|
|
366
|
+
}
|
|
367
|
+
for (let i = 0; i < 100; i++) {
|
|
368
|
+
const firstElement = deque.first;
|
|
369
|
+
expect(deque.shift()).toBe(firstElement);
|
|
370
|
+
}
|
|
469
371
|
|
|
470
|
-
expect([...deque.filter(element => element > 2)]).toEqual([3]);
|
|
471
|
-
expect([...deque.map(element => element * 2)]).toEqual([2, 4, 6]);
|
|
472
|
-
expect(deque.reduce((accumulator, element) => accumulator + element, 0)).toEqual(6);
|
|
473
|
-
});
|
|
474
372
|
});
|
|
475
373
|
});
|