目的:ES6标准下的JS数据结构的一些实现代码。(作为记录和启发)

内容:队列和双端队列。(未完成,待继续)

所有源码在我的Github上(如果觉得不错记得给星鼓励我哦):ES6的JavaScript数据结构实现之队列

一、基础数据结构

1、队列(FIFO)

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
class Queue{
constructor(){
this.count = 0;
this.lowestCount = 0;
this.items ={};
}


enqueue(element) {
this.items[this.count] = element;
this.count++;
}

dequeue() {
if (this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}

peek() {
if (this.isEmpty()){
return undefined;
}
return this.items[this.lowestCount];
}

isEmpty() {
return this.size() === 0;
}
size() {
return this.count - this.lowestCount;
}
clear(){
this.items = {};
this.count = 0;
this.lowestCount = 0;
}
toString(){
if (this.isEmpty()){
return '';
}
let objString = `${this.items[this.lowestCount]}`
for (let i= this.lowestCount + 1; i < this.count;i++){
objString = `${objString},${this.items[i]}`;
}
return objString;
}
}

const queue = new Queue();
console.log(queue.isEmpty());
queue.enqueue('a');
queue.enqueue('b');
queue.enqueue('c');
console.log(queue);
console.log(queue.size());
console.log(queue.toString());
queue.dequeue();
console.log(queue);
console.log(queue.peek());
queue.clear();
console.log(queue);

Queue

2、双端队列(相当于是队列和栈的结合)

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
class Deque {
constructor() {
this.count = 0;
this.lowestCount = 0;
this.items = {};
}
addFront(element){
if (this.isEmpty()){
this.addBack(element);
} else if (this.lowestCount > 0){
this.lowestCount--;
this.items[this.lowestCount] = element;
} else {
for (let i = this.count; i >0 ; i--){
this.items[i] = this.items[i-1];
}
this.count++;
this.items[0] = element;
}
}
addBack(element) {
this.items[this.count] = element;
this.count++;
}

removeFront() {
if (this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}
removeBack() {
if (this.isEmpty()) {
return undefined;
}
this.count--;
const result = this.items[this.count];
delete this.items[this.count];
return result;
}

peekFront() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.lowestCount];
}
peekBack() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.count - 1];
}
isEmpty() {
return this.size() === 0;
}

clear() {
this.items = {};
this.count = 0;
this.lowestCount = 0;
}

size() {
return this.count - this.lowestCount;
}

toString() {
if (this.isEmpty()) {
return '';
}
let objString = `${this.items[this.lowestCount]}`;
for (let i = this.lowestCount + 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`;
}
return objString;
}
}

const deque = new Deque();
console.log(deque.isEmpty());
deque.addBack('a');
deque.addBack('b');
console.log(deque);
console.log(deque.toString());
deque.addBack('c');
deque.removeFront();
console.log(deque);
deque.removeBack();
console.log(deque);
deque.addFront('d');
console.log(deque);

Deque

二、简单应用:击鼓传花,回文检测器。

1、击鼓传花游戏(hot potato),即实现循环队列

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
class Deque {
constructor() {
this.count = 0;
this.lowestCount = 0;
this.items = {};
}
addFront(element){
if (this.isEmpty()){
this.addBack(element);
} else if (this.lowestCount > 0){
this.lowestCount--;
this.items[this.lowestCount] = element;
} else {
for (let i = this.count; i >0 ; i--){
this.items[i] = this.items[i-1];
}
this.count++;
this.items[0] = element;
}
}
addBack(element) {
this.items[this.count] = element;
this.count++;
}

removeFront() {
if (this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}
removeBack() {
if (this.isEmpty()) {
return undefined;
}
this.count--;
const result = this.items[this.count];
delete this.items[this.count];
return result;
}

peekFront() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.lowestCount];
}
peekBack() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.count - 1];
}
isEmpty() {
return this.size() === 0;
}

clear() {
this.items = {};
this.count = 0;
this.lowestCount = 0;
}

size() {
return this.count - this.lowestCount;
}

toString() {
if (this.isEmpty()) {
return '';
}
let objString = `${this.items[this.lowestCount]}`;
for (let i = this.lowestCount + 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`;
}
return objString;
}
}

const deque = new Deque();
console.log(deque.isEmpty());
deque.addBack('a');
deque.addBack('b');
console.log(deque);
console.log(deque.toString());
deque.addBack('c');
deque.removeFront();
console.log(deque);
deque.removeBack();
console.log(deque);
deque.addFront('d');
console.log(deque);

Deque

2、回文检查器,用双端队列。

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
function palindromeChecker(aString){
if (
aString === undefined
|| aString === null
|| (aString !== null && aString.length === 0)
) {
return false;
}
const deque = new Deque;
const lowerString = aString.toLocaleLowerCase().split(' ').join('');
let firstChar;
let lastChar;

for (let i = 0; i <lowerString.length; i++){
deque.addBack(lowerString.charAt(i));
}
while (deque.size() > 1){
firstChar = deque.removeFront();
lastChar = deque.removeBack();
if (firstChar !== lastChar) {
return false;
}
}
return true;
}
console.log(palindromeChecker(''))
console.log(palindromeChecker('a'))
console.log(palindromeChecker(' a'))
console.log(palindromeChecker('aba'))
console.log(palindromeChecker('12a21'))



palindromeChecker