堆栈:运算受限制的线性表,先进后出,限定只在表尾插入和删除元素的线性表
class Stack{
#items=[] //#为E13新出的写法,用于绑定私有变量
//进栈、入栈、压栈
push(data){
this.#items.push(data)
}
//出栈
pop(data){
return this.#items.pop(data)
}
//回到栈顶
peek(){
//return this.#items[this.#items.lenght-1]
return this.#items.at(-1)
}
// 返回栈的长度
size() {
return this.items.length
}
//判断是否为空栈
isEmpty(){
return this.#items.lenght === 0
}
//清空栈
clear(){
this.#items = []
}
//转为字符串
toString(){
return this.#items.join(" ")
}
}
- js中基本数据类型存储在栈中,若将一个变量的值赋值给另一个变量,则这两个变量在内存中是独立的,修改其中任意一个变量的值,不会影响另一个变量。这就是基本数据类型。
- js中的引用类型先通过访问该变量存储在栈中的地址,顺着再访问到堆中
深入思考-浅拷贝与深拷贝
let a={
name:'小罗',
age:18,
like:['睡觉','篮球','游戏']
}
//浅拷贝函数
function smellCopy(data){
let copyData ={}
for(let i in data){
copydata[i] = data[i];
}
return copyData
}
let b = smellCopy(a);//此时b数据与a相同
a.name='大罗';
a.like[0]='摄影';
console.log(a)
// name:'大罗',
// age:18,
// like:['摄影','篮球','游戏']
console.log(b)
// name:'小罗',
// age:18,
// like:['摄影','篮球','游戏']
//深拷贝
const obj2=JSON.parse(JSON.stringify(b));//先转字符串再转回来的方法,但该方法会忽略undefined、null
发现:like跟着变了==>所以浅拷贝只对存储在栈的数据进行了拷贝,而like只有地址是存储在栈中的。
应用
class Stack{
#items=[] //#为E13新出的写法,用于绑定私有变量
//进栈、入栈、压栈
push(data){
this.#items.push(data)
}
//出栈
pop(data){
return this.#items.pop(data)
}
//回到栈顶
peek(){
//return this.#items[this.#items.lenght-1]
return this.#items.at(-1)
}
// 返回栈的长度
size() {
return this.items.length
}
//判断是否为空栈
isEmpty(){
return this.#items.lenght === 0
}
//清空栈
clear(){
this.#items = []
}
//转为字符串
toString(){
return this.#items.join(" ")
}
}
function convert(decNumber,base){
let remStack = new Stack()
let number = decNumber
let baseType = '0123456789ABCDEF'
let str = ''
while(number>0){
remStack.push(number%base)
number = Math.floor(number/base)
}
while(!(remStack.isEmpty() === 0)){
str+=baseType[remStack.pop()]
}
return str
}
参考文献: