Cách xây dựng cấu trúc dữ liệu với lớp JavaScript ES6

Cách xây dựng cấu trúc dữ liệu với lớp JavaScript ES6

Cấu trúc dữ liệu là một khía cạnh cơ bản của khoa học máy tính và lập trình, bất kể ngôn ngữ bạn sử dụng là gì. Có kiến ​​thức kỹ lưỡng về chúng có thể giúp bạn tổ chức, quản lý, lưu trữ và sửa đổi dữ liệu một cách hiệu quả. Việc xác định cấu trúc dữ liệu thích hợp cho trường hợp sử dụng của bạn có thể cải thiện hiệu suất một cách đáng kể.





Tuy nhiên, JavaScript chỉ đi kèm với các cấu trúc dữ liệu nguyên thủy như mảng và đối tượng theo mặc định. Nhưng với sự ra đời của các lớp ECMAScript 6 (ES6), giờ đây bạn có thể tạo cấu trúc dữ liệu tùy chỉnh như ngăn xếp và hàng đợi với sự trợ giúp của cấu trúc dữ liệu nguyên thủy.





cách tải xuống các chương trình trên hulu

Cấu trúc dữ liệu ngăn xếp

Cấu trúc dữ liệu ngăn xếp cho phép bạn đẩy dữ liệu mới lên trên dữ liệu hiện có theo cách LIFO (nhập sau cùng, xuất trước). Cấu trúc dữ liệu tuyến tính này rất dễ hình dung bằng cách sử dụng một ví dụ đơn giản. Hãy xem xét một chồng đĩa được giữ trên bàn. Bạn chỉ có thể thêm hoặc bớt một đĩa từ trên cùng của ngăn xếp.





Đây là cách bạn có thể triển khai cấu trúc dữ liệu ngăn xếp bằng cách sử dụng các mảng JavaScript và Các lớp ES6 :

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

Hãy khám phá và xây dựng một số hoạt động mà bạn có thể thực hiện trên một ngăn xếp.



Hoạt động đẩy

Thao tác đẩy được sử dụng để chèn dữ liệu mới vào ngăn xếp. Bạn cần truyền dữ liệu dưới dạng tham số trong khi gọi phương thức đẩy. Trước khi chèn dữ liệu, con trỏ trên cùng của ngăn xếp được tăng lên một và dữ liệu mới được chèn ở vị trí trên cùng.

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

Hoạt động Pop

Thao tác pop được sử dụng để xóa phần tử dữ liệu trên cùng của ngăn xếp. Trong khi thực hiện thao tác này, con trỏ trên cùng bị giảm đi 1.





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

Hoạt động Peek

Thao tác xem trước được sử dụng để trả về giá trị hiện có ở đầu ngăn xếp. Độ phức tạp về thời gian để truy xuất dữ liệu này là O (1).

Tìm hiểu thêm: Ký hiệu Big-O là gì?





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

Cấu trúc dữ liệu danh sách được liên kết

Danh sách liên kết là một cấu trúc dữ liệu tuyến tính bao gồm nhiều nút được kết nối với nhau với sự trợ giúp của con trỏ. Mỗi nút trong danh sách chứa dữ liệu và một biến con trỏ trỏ đến nút tiếp theo trong danh sách.

Tìm hiểu thêm: Giới thiệu về Con trỏ dành cho Lập trình viên

Không giống như ngăn xếp, triển khai danh sách liên kết trong JavaScript yêu cầu hai lớp. Lớp học đầu tiên là Nút lớp để tạo một nút và lớp thứ hai là LinkedList lớp để thực hiện tất cả các thao tác trên danh sách liên kết. Con trỏ đầu trỏ đến nút đầu tiên của danh sách được liên kết và con trỏ đuôi trỏ đến nút cuối cùng của danh sách được liên kết.

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

Dưới đây là một số thao tác chính mà bạn có thể thực hiện trên danh sách được liên kết:

Nối hoạt động

Hoạt động nối thêm được sử dụng để thêm một nút mới vào cuối danh sách được liên kết. Bạn phải chuyển dữ liệu làm tham số để chèn một nút mới. Đầu tiên, tạo một đối tượng nút mới bằng cách sử dụng Mới từ khóa trong JavaScript.

Nếu danh sách liên kết trống, cả con trỏ đầu và đuôi sẽ trỏ đến nút mới. Nếu không, chỉ con trỏ đuôi mới trỏ đến nút mới.

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;
}

Chèn hoạt động

Để chèn một nút mới tại một chỉ mục cụ thể, bạn có thể sử dụng thao tác chèn. Phương thức này nhận hai tham số: dữ liệu cần chèn và chỉ mục mà tại đó nó sẽ được chèn. Trong trường hợp xấu nhất, phương pháp này có độ phức tạp về thời gian là O (N) vì nó có thể phải duyệt qua toàn bộ danh sách.

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;
}

Xóa hoạt động

Thao tác xóa đi qua danh sách được liên kết để nhận tham chiếu đến nút sẽ bị xóa và xóa liên kết của nút trước đó. Tương tự như thao tác chèn, thao tác xóa cũng có độ phức tạp về thời gian là O (N) trong trường hợp xấu nhất.

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;
}

Cấu trúc dữ liệu hàng đợi

Cấu trúc dữ liệu hàng đợi tương tự như một nhóm người đang đứng trong một hàng đợi. Người vào hàng đợi trước được phục vụ trước những người khác. Tương tự, cấu trúc dữ liệu tuyến tính này tuân theo phương pháp FIFO (nhập trước, xuất trước) để chèn và xóa dữ liệu. Cấu trúc dữ liệu này có thể được tạo lại trong JavaScript bằng cách sử dụng danh sách được liên kết theo cách sau:

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

Đây là cách bạn có thể chèn và xóa dữ liệu khỏi hàng đợi trong JavaScript:

tôi có thể mua một con chó con ở đâu

Hoạt động Enqueue

Thao tác enqueue chèn dữ liệu mới vào hàng đợi. Trong khi gọi phương thức này, nếu cấu trúc dữ liệu hàng đợi trống, cả con trỏ phía trước và phía sau đều trỏ đến nút mới được chèn trong hàng đợi. Nếu hàng đợi không trống, nút mới sẽ được thêm vào cuối danh sách và con trỏ phía sau trỏ đến nút này.

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;
}

Hoạt động Dequeue

Thao tác dequeue loại bỏ phần tử đầu tiên trong hàng đợi. Trong hoạt động dequeue, con trỏ đầu được di chuyển tới nút thứ hai trong danh sách. Nút thứ hai này bây giờ trở thành phần đầu của hàng đợi.

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;
}

Bước tiếp theo sau cấu trúc dữ liệu

Cấu trúc dữ liệu có thể là một khái niệm khó nắm bắt, đặc biệt nếu bạn là người mới lập trình. Nhưng cũng giống như bất kỳ kỹ năng nào khác, thực hành có thể giúp bạn thực sự hiểu và đánh giá cao hiệu quả mà nó mang lại cho việc lưu trữ và quản lý dữ liệu trong các ứng dụng của bạn.

Các thuật toán cũng hữu ích như cấu trúc dữ liệu và có thể trở thành bước hợp lý tiếp theo trong hành trình lập trình của bạn. Vì vậy, tại sao không bắt đầu với một thuật toán sắp xếp như sắp xếp bong bóng?

Đăng lại Đăng lại tiếng riu ríu E-mail Giới thiệu về thuật toán sắp xếp bong bóng

Thuật toán Sắp xếp bong bóng: một giới thiệu tuyệt vời về sắp xếp các mảng.

Đọc tiếp
Chủ đề liên quan
  • Lập trình
  • JavaScript
  • Lập trình
  • Hướng dẫn viết mã
Giới thiệu về tác giả Nitin Ranganath(31 bài báo đã xuất bản)

Nitin là một nhà phát triển phần mềm đam mê và là một sinh viên kỹ thuật máy tính đang phát triển các ứng dụng web bằng công nghệ JavaScript. Anh ấy làm việc như một nhà phát triển web tự do và thích viết cho Linux và Lập trình khi rảnh rỗi.

Xem thêm từ Nitin Ranganath

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký