Jak vytvářet datové struktury pomocí tříd JavaScript ES6

Jak vytvářet datové struktury pomocí tříd JavaScript ES6

Datové struktury jsou základním aspektem počítačové vědy a programování, bez ohledu na jazyk, který používáte. Jejich důkladná znalost vám může pomoci efektivně organizovat, spravovat, ukládat a upravovat data. Identifikace správné datové struktury pro váš případ použití může výrazně zlepšit výkon.





JavaScript však ve výchozím nastavení přichází pouze s primitivními datovými strukturami, jako jsou pole a objekty. Ale se zavedením tříd ECMAScript 6 (ES6) můžete nyní vytvářet vlastní datové struktury, jako jsou zásobníky a fronty, pomocí primitivních datových struktur.





jak stahovat pořady na hulu

Struktura dat zásobníku

Datová struktura zásobníku vám umožňuje tlačit nová data na stávající data způsobem LIFO (poslední vstup, první výstup). Tuto lineární datovou strukturu lze snadno zobrazit na jednoduchém příkladu. Zvažte hromádku talířů položenou na stole. Desku můžete přidat nebo odebrat pouze z horní části stohu.





Zde je návod, jak můžete implementovat datovou strukturu zásobníku pomocí polí JavaScript a Třídy ES6 :

class Stack {
constructor() {
this.data = [];
this.top = -1;
}
}

Pojďme prozkoumat a sestavit některé z operací, které můžete na zásobníku provádět.



Push operace

Operace push se používá k vložení nových dat do zásobníku. Při volání metody push musíte data předat jako parametr. Před vložením dat se horní ukazatel zásobníku zvýší o jednu a nová data se vloží do horní polohy.

push(data) {
this.top++;
this.data[this.top] = data;
return this.data;
}

Popová operace

Operace pop se používá k odebrání nejvyššího datového prvku zásobníku. Při provádění této operace se horní ukazatel zmenší o 1.





pop() {
if (this.top <0) return undefined;
const poppedTop = this.data[this.top];
this.top--;
return poppedTop;
}

Operace Peek

Operace peek se používá k vrácení hodnoty přítomné v horní části zásobníku. Časová náročnost načítání těchto dat je O (1).

Další informace: Co je Big-O notace?





peek() {
return this.top >= 0 ? this.data[this.top] : undefined;
}

Struktura dat propojeného seznamu

Propojený seznam je lineární datová struktura skládající se z mnoha uzlů spojených navzájem pomocí ukazatelů. Každý uzel v seznamu obsahuje data a proměnnou ukazatele, která ukazuje na další uzel v seznamu.

Další informace: Úvod do ukazatelů pro programátory

Na rozdíl od zásobníku vyžadují implementace propojeného seznamu v JavaScriptu dvě třídy. První třída je Uzel třída pro vytvoření uzlu a druhá třída je Spojový seznam třídy k provedení všech operací v propojeném seznamu. Ukazatel hlavy ukazuje na první uzel propojeného seznamu a ukazatel ocasu ukazuje na poslední uzel propojeného seznamu.

class Node {
constructor(data, next = null) {
this.data = data;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this.size = 0;
}
}

Zde jsou některé primární operace, které můžete provádět v propojeném seznamu:

Připojit operaci

Operace připojení se používá k přidání nového uzlu na konec propojeného seznamu. Data musíte předat jako parametr pro vložení nového uzlu. Nejprve vytvořte nový objekt uzlu pomocí Nový klíčové slovo v JavaScriptu.

Pokud je propojený seznam prázdný, ukazatel na hlavu i na konec bude ukazovat na nový uzel. V opačném případě bude na nový uzel ukazovat pouze ukazatel ocasu.

append(data) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.size++;
return this;
}

Vložit operaci

Chcete -li vložit nový uzel do určitého indexu, můžete použít operaci vložení. Tato metoda má dva parametry: vložená data a index, do kterého mají být vloženy. V nejhorším případě má tato metoda časovou složitost O (N), protože může muset procházet celým seznamem.

insert(data, index) {
if (index this.size) return undefined;
if (index === 0) {
this.head = new Node(data, this.head);
!this.tail ? (this.tail = this.head) : null;
this.size++;
return this;
}
if (index === this.size) return this.append(data);
let count = 0;
let beforeNode = this.head;
while (count !== index) {
beforeNode = beforeNode.next;
count++;
}
const newNode = new Node(data);
let afterNode = beforeNode.next;
newNode.next = afterNode;
beforeNode.next = newNode;
this.size++;
return this;
}

Odstranit operaci

Operace odstranění prochází propojeným seznamem, aby získala odkaz na uzel, který má být odstraněn, a odebere odkaz předchozího uzlu. Podobně jako u operace vložení má operace odstranění také v nejhorším případě časovou složitost O (N).

deleteNode(index) {
if (index === 0) {
const removedHead = this.head;
this.head = this.head.next;
this.size--;
this.size === 0 ? (this.tail = null) : null;
return removedHead;
}
if (index === this.size - 1) {
if (!this.head) return undefined;
let currentNode = this.head;
let newTail = currentNode;
while (currentNode.next) {
newTail = currentNode;
currentNode = currentNode.next;
}
this.tail = newTail;
this.tail.next = null;
this.size--;
this.size === 0 ? ([this.head, this.tail] = [null, null]) : null;
return currentNode;
}
if (index this.size - 1) return undefined;
let count = 0;
let beforeNode = this.head;
while (count !== index - 1) {
beforeNode = beforeNode.next;
count++;
}
const removedNode = beforeNode.next;
let afterNode = removedNode.next;
beforeNode.next = afterNode;
removedNode.next = null;
this.size--;
return removedNode;
}

Datová struktura fronty

Datová struktura fronty je podobná partě lidí stojících ve frontě. Osoba, která vstoupí do fronty jako první, je obsluhována před ostatními. Podobně tato lineární datová struktura postupuje podle FIFO (první dovnitř, první ven) pro vkládání a odebírání dat. Tuto datovou strukturu lze znovu vytvořit v JavaScriptu pomocí propojeného seznamu tímto způsobem:

class Queue {
constructor() {
this.front = null;
this.rear = null;
this.size = 0;
}
}

Zde je návod, jak můžete vkládat a odebírat data z fronty v JavaScriptu:

aplikace pro použití s ​​tužkou na jablko

Provoz Enqueue

Operace zařazení do fronty vloží nová data do fronty. Při volání této metody platí, že pokud je datová struktura fronty prázdná, přední i zadní ukazatel směřují na nově vložený uzel ve frontě. Pokud fronta není prázdná, nový uzel se přidá na konec seznamu a zadní ukazatel ukazuje na tento uzel.

enqueue(data) {
const newNode = new Node(data);
if (!this.front) {
this.front = newNode;
this.rear = newNode;
} else {
this.rear.next = newNode;
this.rear = newNode;
}
this.size++;
return this;
}

Provoz dequeue

Operace vyřazení odstraní první prvek ve frontě. Během operace vyřazení se hlavní ukazatel přesune dopředu na druhý uzel v seznamu. Tento druhý uzel se nyní stane vedoucím fronty.

dequeue() {
if (!this.front) return undefined;
if (this.front === this.rear) this.rear = null;
const dequeuedNode = this.front;
this.front = this.front.next;
this.size--;
return dequeuedNode;
}

Další krok po datových strukturách

Datové struktury mohou být složitým konceptem, zvláště pokud jste v programování nováčci. Ale jako každá jiná dovednost, praxe vám může pomoci skutečně porozumět a ocenit účinnost, kterou poskytuje pro ukládání a správu dat ve vašich aplikacích.

Algoritmy jsou stejně užitečné jako datové struktury a mohly by se stát dalším logickým krokem na vaší cestě za programováním. Proč tedy nezačít s třídicím algoritmem, jako je bublinkové třídění?

Podíl Podíl tweet E-mailem Úvod do algoritmu řazení bublin

Algoritmus Bubble Sort: vynikající úvod do třídění polí.

Číst dále
Související témata
  • Programování
  • JavaScript
  • Programování
  • Návody na kódování
O autorovi Nitin Ranganath(31 článků zveřejněno)

Nitin je vášnivý vývojář softwaru a student počítačového inženýrství vyvíjející webové aplikace pomocí technologií JavaScript. Pracuje jako webový vývojář na volné noze a ve svém volném čase rád píše pro Linux a programování.

Více od Nitin Ranganath

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru