●章JavaScript簡介1
1.1JavaScript數據結構與算法1
1.2環境搭建2
1.2.1最簡單的環境搭建2
1.2.2使用Web服務器3
1.2.3Node.jshttp-server5
1.3JavaScript基礎5
1.3.1變量6
1.3.2運算符8
1.3.3真值和假值11
1.3.4相等運算符(==和===)12
1.4控制結構14
1.4.1條件語句14
1.4.2循環15
1.5函數16
1.6JavaScript面向對像編程17
1.7調試工具18
1.8小結20
第2章ECMAScript和TypeScript概述21
2.1ECMAScript還是JavaScript21
2.1.1ES6、ES2015、ES7、ES2016、ES8、ES2017和ES.Next21
2.1.2使用Babel.js23
2.2ECMAScript2015+的功能24
2.2.1用let替代var聲明變量24
2.2.2模板字面量27
2.2.3箭頭函數27
2.2.4函數的參數默認值28
2.2.5聲明展開和剩餘參數29
2.2.6增強的對像屬性30
2.2.7使用類進行面向對像編程31
2.2.8乘方運算符33
2.2.9模塊33
2.3介紹TypeScript39
2.3.1類型推斷40
2.3.2接口41
2.3.3其他TypeScript功能43
2.3.4TypeScript中對JavaScript文件的編譯時檢查43
2.4小結44
第3章數組45
3.1為什麼用數組45
3.2創建和初始化數組46
3.素47
3.3.1在數組末素47
3.3.2在數組開素48
3.素49
3.4.1從數組末素49
3.4.2從數組開素49
3.5在任意位置添加素51
3.6二維和多維數組51
3.6.1迭代二維素52
3.6.2多維數組53
3.7JavaScript的數組方法參考54
3.7.1數組合並55
3.7.2迭代器函數55
3.7.3ECMAScript6和數組的新功能57
3.7.素60
3.7.5搜索63
3.7.6輸出數組為字符串64
3.8類型數組64
3.9TypeScript中的數組65
3.10小結66
第4章棧67
4.1創建一個JavaScript數據結構和算法庫67
4.2棧數據結構68
4.2.1創建一個基於數組的棧69
4.2.2向素69
4.2.3從素70
4.2.4查素70
4.2.5檢查棧是否為空71
4.2.6素71
4.2.7使用Stack類71
4.3創建一個基於JavaScript對像的Stack類73
4.3.1向棧素73
4.3.2驗證一個棧是否為空和它的大小74
4.3.3從棧素74
4.3.4查看棧頂的值並將棧清空75
4.3.5創建toString方法75
4.4保護數據結素76
4.4.1下劃線命名約定76
4.4.2用ES2015的限定作用域Symbol實現類77
4.4.3用ES2015的WeakMap實現類77
4.4.4ECMAScript類屬性提案78
4.5用棧解決問題79
4.6小結81
第5章隊列和雙端隊列82
5.1隊列數據結構82
5.1.1創建隊列83
5.1.2使用Queue類86
5.2雙端隊列數據結構87
5.2.1創建Deque類87
5.2.2使用Deque類89
5.3使用隊列和雙端隊列來解決問題90
5.3.1循環隊列——擊鼓傳花遊戲90
5.3.2回文檢查器91
5.3.3JavaScript任務隊列93
5.4小結93
第6章鏈表94
6.1鏈表數據結構94
6.2雙向鏈表106
6.2.1在任意位置素107
6.2.2從任意位素109
6.3循環鏈表111
6.3.1在任意位置素112
6.3.2從任意位素113
6.4有序鏈表114
6.5創建StackLinkedList類116
6.6小結117
第7章集合118
7.1構建數據集合118
7.2創建集合類119
7.2.1has(element)方法119
7.2.2add方法120
7.2.3delete和clear方法120
7.2.4size方法121
7.2.5values方法122
7.2.6使用Set類122
7.3集合運算123
7.3.1並集123
7.3.2交集125
7.3.3差集127
7.3.4子集128
7.4ECMAScript2015——Set類130
7.5多重集或袋132
7.6小結133
第8章字典和散列表134
8.1字典134
8.1.1創建字典類135
8.1.2使用Dictionary類141
8.2散列表142
8.2.1創建散列表143
8.2.2使用HashTable類146
8.2.3散列表和散列集合147
8.2.4處理散列表中的衝突147
8.2.5創建更好的散列函數158
8.3ES2015Map類159
8.4ES2105WeakMap類和WeakSet類159
8.5小結160
第9章遞歸161
9.1理解遞歸161
9.2計算一個數的階乘162
9.2.1迭代階乘162
9.2.2遞歸階乘163
9.3斐波那契數列165
9.3.1迭代求斐波那契數166
9.3.2遞歸求斐波那契數166
9.3.3記憶化斐波那契數167
9.4為什麼要用遞歸?它更快嗎167
9.5小結168
0章樹169
10.1樹數據結構169
10.2樹的相關術語170
10.3二叉樹和二叉搜索樹170
10.3.1創建BinarySearchTree類171
10.3.2向二叉搜索樹中插入一個鍵172
10.4樹的遍歷175
10.4.1中序遍歷175
10.4.2先序遍歷176
10.4.3後序遍歷177
10.5搜索樹中的值178
10.5.1搜索最小值和優選值178
10.5.2搜索一個特定的值180
10.5.3移除一個節點182
10.6自平衡樹185
10.6.1Adelson-Velskii-Landi樹(AVL樹)185
10.6.2紅黑樹194
10.7小結200
1章二叉堆和堆排序201
11.1二叉堆數據結構201
11.1.1創建最小堆類202
11.1.2創建優選堆類208
11.2堆排序算法209
11.3小結211
2章圖212
12.1圖的相關術語212
12.2圖的表示214
12.2.1鄰接矩陣215
12.2.2鄰接表215
12.2.3關聯矩陣216
12.3創建Graph類216
12.4圖的遍歷219
12.4.1廣度優先搜索220
12.4.2深度優先搜索225
12.5最短路徑算法231
12.5.1Dijkstra算法232
12.5.2Floyd-Warshall算法234
12.6最小生成樹235
12.6.1Prim算法236
12.6.2Kruskal算法237
12.7小結238
3章排序和搜索算法239
13.1排序算法239
13.1.1冒泡排序239
13.1.2選擇排序242
13.1.3插入排序244
13.1.4歸並排序245
13.1.5快速排序247
13.1.6計數排序251
13.1.7桶排序253
13.1.8基數排序255
13.2搜索算法257
13.2.1順序搜索257
13.2.2二分搜索258
13.2.3內插搜索260
13.3隨機算法261
13.4小結262
4章算法設計與技巧263
14.1分而治之263
14.2動態規劃265
14.2.1最少硬幣找零問題266
14.2.2背包問題268
14.2.3最長公共子序列270
14.2.4矩陣鏈相乘272
14.3貪心算法274
14.3.1最少硬幣找零問題274
14.3.2分數背包問題275
14.4回溯算法276
14.4.1迷宮老鼠問題277
14.4.2數獨解題器279
14.5函數式編程簡介282
14.5.1函數式編程與命令式編程283
14.5.3JavaScript函數式工具箱——map、filter和reduce284
14.5.4JavaScript函數式類庫和數據結構286
14.6小結286
5章算法復雜度287
15.1大O表示法287
15.1.1理解大O表示法287
15.1.2時間復雜度比較289
15.1.3NP完全理論概述292
15.2用算法娛樂身心293
15.3小結294
內容簡介
本書首先介紹了JavaScript語言的基礎知識(包括ECMAScript和TypeScript),其次討論了數組、棧、隊列、雙端隊列和鏈表等重要的數據結構,隨後分析了集合、字典和散列表的工作原理,接下來闡述了遞歸的原理、什麼是樹以及二叉堆和堆排序,然後介紹了圖、DFS和BFS算法、各種排序(冒泡排序、選擇排序、插入排序、歸並排序、快速排序、計數排序、桶排序和基數排序)和搜索(順序搜索、二分搜索和內插搜索)算法以及隨機算法,接著介紹了分而治之、動態規劃、貪心算法和回溯算法等不錯算法以及函數式編程,很後還介紹了如何計算算法的復雜度。