栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈通常的操作:

stack()        // 创建一个空的栈对象
push()         // 入栈操作,将元素放至栈顶
pop()          // 出栈操作,将栈顶元素移除并返回
peek()         // 返回栈顶元素,不对栈做出操作
isEmpty()      // 判断栈是不是为空
size()         // 返回栈的元素个数

使用javascript模拟栈的实现:

function Stack () {
  let items = []
  this.push = function (element) {
    //添加一个(或几个)新元素到栈顶
    items.push(element)
  }
  this.pop = function () {
    //移除栈顶的元素,同时返回被移除元素
    return items.pop()
  }
  this.peek = function () {
    //返回栈顶的元素,但并不对栈做任何修改
    return items[items.length - 1]
  }
  this.isEmpty = function () {
    // 判断栈是不是为空
    return items.length === 0
  }
  this.size = function () {
    // 返回栈里元素的个数
    return items.length
  }
  this.clear = function () {
    // 移除栈里所有的元素
    items = []
  }
  this.print = function () {
    console.log(items.toString())
  }
  this.toString = function () {
    return items.toString()
  }
}

用栈解决进制数转换问题:


function divide (num, base) {
   // num为需要转换的数, base为要转换的基数
  let remStack = new Stack(),
      rem,
      remString = ''
  while (num > 0) {
    rem = Math.floor(num % base)
    remStack.push(rem)
    num = Math.floor(num / base)
  }
  while (!remStack.isEmpty()) {
    remString += remStack.pop()
  }
  return remString
}

console.log(divide(18,16))

RayHuang
61 声望5 粉丝