重温数据结构基础(1):栈

207 阅读1分钟

简介

  作为基本的数据结构之一,栈在日常工作中时比较常见的,例如数字的进制转换。本篇文章主要展示栈的数据结构,以及常用的栈代码的实现,也算是自己对于栈的认知一个总结。

栈的基本结构

  栈是一种遵从后进先出(LIFO,Last In First Out)的数据结构。其类似我们向一个杯子里放石子。当我们倒出石子时,后面放入的石子总是先倒出来。

栈的实现

首先一个栈具有以下方法

  • push(elements) :添加一个或(多个)新元素到栈顶。
  • pop() :移除栈顶的元素,同时返回被移除的元素
  • peek():返回栈顶的元素,不对栈做任何修改
  • isEmpty():如果栈里没有任何元素则返回true,否则返回false
  • clear():清除栈中所有元素
  • size():返回栈中元素的个数 得益于js独特的对象结构,我们将从两种方法实现一个栈。

注:栈内的方法也是对基本的数据结构的一个存取操作。

基于js数组的栈实现

class Stack{
  constructor(){
    this.items=[]
  }
  push(elements){
    this.items.push(elements)
  }
  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
  }
}

基于js对象的基本实现

class Stack {
  constructor(){
    this.count=0
    this.items ={}
  }
  push(...e){
    for(let i =0;i<e.length;i++){
      this.items[this.count]=e[i]
      this.count++
    }
  }
  pop(){
    if(this.isEmpty()){
      return undefined
    }
    this.count--
    let result =  this.items[this.count];
    delete this.items[this.count]
    return result;
  }
  peek(){
    if(this.isEmpty()){
      return undefined
    }
    return this.items[this.count-1]
  }
  size(){
    return this.count;
  }
  isEmpty(){
    return  this.count==0
  }
  clear(){
	this.items={}
  }
}

对比

在存取大量数据时基于数组实现的栈比基于对象的栈需要更多的存储,这是由于数组是一个有序集合,其存放时必然会需要额外的空间来保持顺序,而对象的存放是无序的,故相对而言,存储更低。