Deque.js
2.0 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
'use strict'
const DoublyLinkedList = require('./DoublyLinkedList')
const DequeIterator = require('./DequeIterator')
/**
* DoublyLinkedList backed double ended queue
* implements just enough to keep the Pool
*/
class Deque {
constructor () {
this._list = new DoublyLinkedList()
}
/**
* removes and returns the first element from the queue
* @return {[type]} [description]
*/
shift () {
if (this._length === 0) {
return undefined
}
const node = this._list.head
this._list.remove(node)
return node.data
}
/**
* adds one elemts to the beginning of the queue
* @param {[type]} element [description]
* @return {[type]} [description]
*/
unshift (element) {
const node = DoublyLinkedList.createNode(element)
this._list.insertBeginning(node)
}
/**
* adds one to the end of the queue
* @param {[type]} element [description]
* @return {[type]} [description]
*/
push (element) {
const node = DoublyLinkedList.createNode(element)
this._list.insertEnd(node)
}
/**
* removes and returns the last element from the queue
*/
pop () {
if (this._length === 0) {
return undefined
}
const node = this._list.tail
this._list.remove(node)
return node.data
}
[Symbol.iterator] () {
return new DequeIterator(this._list)
}
iterator () {
return new DequeIterator(this._list)
}
reverseIterator () {
return new DequeIterator(this._list, true)
}
/**
* get a reference to the item at the head of the queue
* @return {element} [description]
*/
get head () {
if (this._list.length === 0) {
return undefined
}
const node = this._list.head
return node.data
}
/**
* get a reference to the item at the tail of the queue
* @return {element} [description]
*/
get tail () {
if (this._list.length === 0) {
return undefined
}
const node = this._list.tail
return node.data
}
get length () {
return this._list.length
}
}
module.exports = Deque