色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

javascript中棧和堆

高雨晴1年前6瀏覽0評論
JavaScript中棧和堆是兩個(gè)非常重要的概念,它們是內(nèi)存管理的重要組成部分。在正式介紹棧和堆之前,我們需要先解釋一下JavaScript中的數(shù)據(jù)類型。JavaScript中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用類型兩種。
基本數(shù)據(jù)類型包括Number、String、Boolean、undefined和null等五種類型。它們的特點(diǎn)是存儲(chǔ)在棧內(nèi)存中,占據(jù)固定的空間,可以直接操作。
引用類型包括Object、Array、Function等類型。它們的特點(diǎn)是存儲(chǔ)在堆內(nèi)存中,占據(jù)不固定的空間,需要通過引用來進(jìn)行操作。
棧是一個(gè)先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),它的存儲(chǔ)方式與函數(shù)調(diào)用有關(guān)。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),它的參數(shù)、局部變量和返回地址等信息都會(huì)被存儲(chǔ)在棧內(nèi)存中,當(dāng)函數(shù)執(zhí)行結(jié)束時(shí),這些信息就會(huì)被從棧內(nèi)存中清除。
下面我們來看一下一個(gè)棧的實(shí)現(xiàn):
class Stack {
constructor() {
this.items = [];
}
// 添加元素
push(element) {
this.items.push(element);
}
// 移除元素
pop() {
return this.items.pop();
}
// 返回棧頂元素
peek() {
return this.items[this.items.length - 1];
}
// 判斷棧是否為空
isEmpty() {
return this.items.length === 0;
}
// 清空棧
clear() {
this.items = [];
}
// 返回棧的長度
size() {
return this.items.length;
}
}
const stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.pop()); // 3
console.log(stack.peek()); // 2
console.log(stack.size()); // 2
stack.clear();
console.log(stack.isEmpty()); // true

堆是一種由操作系統(tǒng)動(dòng)態(tài)分配內(nèi)存的方式,它的存儲(chǔ)方式與指針有關(guān)。在JavaScript中,我們可以通過new關(guān)鍵字來創(chuàng)建一個(gè)對象,它會(huì)在堆內(nèi)存中分配空間,并返回一個(gè)指向該對象的引用。同時(shí),我們也可以通過引用來訪問堆內(nèi)存中的對象。
下面我們來看一下一個(gè)堆的實(shí)現(xiàn):
class Heap {
constructor() {
this.data = [];
}
// 向堆中插入元素
insert(item) {
this.data.push(item);
this.upAdjust(this.data.length - 1);
}
// 刪除堆頂元素
remove() {
if (this.data.length === 0) {
return null;
}
const top = this.data[0];
this.data[0] = this.data.pop();
this.downAdjust(0);
return top;
}
// 上浮調(diào)整
upAdjust(index) {
let parentIndex = parseInt((index - 1) / 2);
while (index > 0 && this.data[index] > this.data[parentIndex]) {
[this.data[index], this.data[parentIndex]] = [this.data[parentIndex], this.data[index]];
index = parentIndex;
parentIndex = parseInt((index - 1) / 2);
}
}
// 下沉調(diào)整
downAdjust(index) {
let childIndex = index * 2 + 1;
while (childIndex < this.data.length) {
if (childIndex + 1 < this.data.length && this.data[childIndex + 1] > this.data[childIndex]) {
childIndex++;
}
if (this.data[index] > this.data[childIndex]) {
break;
}
[this.data[index], this.data[childIndex]] = [this.data[childIndex], this.data[index]];
index = childIndex;
childIndex = index * 2 + 1;
}
}
}
const heap = new Heap();
heap.insert(1);
heap.insert(3);
heap.insert(2);
heap.insert(6);
heap.insert(5);
console.log(heap.remove()); // 6

上面的代碼實(shí)現(xiàn)了一個(gè)最大堆,我們可以使用insert方法向堆中插入元素,使用remove方法刪除堆頂元素。在插入元素時(shí),我們需要執(zhí)行upAdjust方法,將新插入的元素上浮到正確的位置上;在刪除堆頂元素時(shí),我們需要執(zhí)行downAdjust方法,將堆底元素下沉到正確的位置上。
綜上所述,棧和堆是兩個(gè)非常重要的概念,在JavaScript中也都有著廣泛的應(yīng)用。對于基本數(shù)據(jù)類型,我們通常使用棧來存儲(chǔ),它的存儲(chǔ)方式與函數(shù)調(diào)用有關(guān);對于引用類型,我們則需要使用堆來存儲(chǔ),它的存儲(chǔ)方式與指針有關(guān)。