JS栈

28 阅读2分钟

堆栈:运算受限制的线性表,先进后出,限定只在表尾插入和删除元素的线性表

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
}

参考文献: