Javascript中的8种常见数据结构

更好地了解数据结构如何工作
这听起来是否熟悉:"我通过完成网上课程开始了前端开发"
您可能正在寻求提高计算机科学的基础知识,尤其是在数据结构和算法方面 。今天,我们将介绍一些常见的数据结构,并以JAVAScript实施它们 。
希望这部分内容可以补充您的技能!

Javascript中的8种常见数据结构

文章插图
 
1.Stack 堆栈
Javascript中的8种常见数据结构

文章插图
 
堆栈遵循LIFO(后进先出)的原理 。如果您堆叠书籍,则最上层的书籍将排在最底层的书籍之前 。或者,当您在Internet上浏览时,后退按钮会将您带到最近浏览的页面 。
Stack具有以下常见方法:
· push:输入一个新元素
· pop:删除顶部元素,返回删除的元素
· peek:返回顶部元素
· length:返回堆栈中的元素数
JavaScript中的数组具有Stack的属性,但是我们使用Stack()函数从头开始构建Stack
function Stack() {this.count = 0; this.storage = {}; this.push = function (value) { this.storage[this.count] = value; this.count++; } this.pop = function () { if (this.count === 0) { return undefined; } this.count--; var result = this.storage[this.count]; delete this.storage[this.count]; return result; } this.peek = function () { return this.storage[this.count - 1]; } this.size = function () { return this.count; }}2.Queue 队列
Javascript中的8种常见数据结构

文章插图
 
队列类似于堆栈 。唯一的区别是Queue使用FIFO原理(先进先出) 。换句话说,当您排队等候总线时,队列中的第一个将始终排在第一位 。
队列具有以下方法:
· enqueue 入队:输入队列,在最后添加一个元素
· dequeue 出队:离开队列,移除前元素并返回
· front:获取第一个元素
· isEmpty:确定队列是否为空
· size:获取队列中的元素数)
JavaScript中的数组具有Queue的某些属性,因此我们可以使用数组来构造Queue的示例:
function Queue() { var collection = []; this.print = function () { console.log(collection); } this.enqueue = function (element) { collection.push(element); } this.dequeue = function () { return collection.shift(); } this.front = function () { return collection[0]; } this.isEmpty = function () { return collection.length === 0; } this.size = function () { return collection.length; }}优先队列
队列还有另一个高级版本 。为每个元素分配优先级,并将根据优先级对它们进行排序:
function PriorityQueue() { ... this.enqueue = function (element) { if (this.isEmpty()) { collection.push(element); } elsevar added = false; for (var i = 0; i < collection.length; i++) { if (element[1] < collection[i][1]) { collection.splice(i, 0, element); added = true; break; } } if (!added) { collection.push(element); } } }}测试一下:
var pQ = new PriorityQueue();pQ.enqueue([ gannicus , 3]);pQ.enqueue([ spartacus , 1]);pQ.enqueue([ crixus , 2]);pQ.enqueue([ oenomaus , 4]);pQ.print();结果:
[ [ spartacus , 1 ], [ crixus , 2 ], [ gannicus , 3 ], [ oenomaus , 4 ]]3.链表
Javascript中的8种常见数据结构

文章插图
 
从字面上看,链表是一个链式数据结构,每个节点由两部分信息组成:该节点的数据和指向下一个节点的指针 。链表和常规数组都是带有序列化存储的线性数据结构 。当然,它们也有差异:
Javascript中的8种常见数据结构

文章插图
 
单边链表通常具有以下方法:
· size:返回节点数
· head:返回head的元素
· add:在尾部添加另一个节点
· delete:删除某些节点
· indexOf:返回节点的索引
· elementAt:返回索引的节点
· addAt:在特定索引处插入节点
· removeAt:删除特定索引处的节点
/** Node in the linked list **/function Node(element) {// Data in the node this.element = element;// Pointer to the next nodethis.next = null;} function LinkedList() {var length = 0;var head = null;this.size = function () {return length;}this.head = function () {return head;}this.add = function (element) {var node = new Node(element);if (head == null) {head = node;} else {var currentNode = head;while (currentNode.next) {currentNode = currentNode.next;}currentNode.next = node;}length++;}this.remove = function (element) {var currentNode = head;var previousNode;if (currentNode.element === element) {head = currentNode.next;} else {while (currentNode.element !== element) {previousNode = currentNode;currentNode = currentNode.next;}previousNode.next = currentNode.next;}length--;}this.isEmpty = function () {return length === 0;}this.indexOf = function (element) {var currentNode = head;var index = -1;while (currentNode) {index++;if (currentNode.element === element) {return index;}currentNode = currentNode.next;}return -1;}this.elementAt = function (index) {var currentNode = head;var count = 0;while (count < index) {count++;currentNode = currentNode.next;}return currentNode.element;}this.addAt = function (index, element) {var node = new Node(element);var currentNode = head;var previousNode;var currentIndex = 0;if (index > length) {return false;}if (index === 0) {node.next = currentNode;head = node;} else {while (currentIndex < index) {currentIndex++;previousNode = currentNode;currentNode = currentNode.next;}node.next = currentNode;previousNode.next = node;}length++;}this.removeAt = function (index) {var currentNode = head;var previousNode;var currentIndex = 0;if (index < 0 || index >= length) {return null;}if (index === 0) {head = currentIndex.next;} else {while (currentIndex < index) {currentIndex++;previousNode = currentNode;currentNode = currentNode.next;}previousNode.next = currentNode.next;}length--;return currentNode.element;} }


推荐阅读