1

前言

栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快且很容易实现。

一、什么是栈

栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称之为栈顶。
栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。
由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问,我们必须先拿掉上面的元素才能访问其栈底的元素。
对栈的主要操作是将一个元素压入栈和将一个元素弹出栈,入栈使用push()方法,出栈使用pop()方法。

二、构造栈数据结构

我们将使用JavaScript实现栈结构,各部分功能使用注释说明。
存储数据我们使用的是数组。

/**
 * Stack 构造方法
 */
function Stack () {
  this.dataStore = []
  this.top = 0
  this.push = push
  this.pop = pop
  this.peek = peek
  this.clear = clear
  this.length = length
}

/**
 * push() 该方法用于向栈压入元素
 * 向栈中压入一个新元素,将其保存在数组中变量top所对应的位置
 * 然后将 top + 1 让其指向数组中下一个空位置
 * @param {*} element
 */
function push (element) {
  this.dataStore[this.top++] = element
}

/**
 * pop() 该方法用于从栈顶推出元素
 * 返回栈顶元素,同时将变量top - 1
 */
function pop () {
  return this.dataStore[--this.top]
}

/**
 * peek() 该方法用于返回数组的第 top - 1 个位置的元素
 */
function peek () {
  return this.dataStore[this.top - 1]
}

/**
 * length() 该方法用于获取栈的长度
 * 返回当前top值即可获得栈内元素个数
 */
function length () {
  return this.top
}

/**
 * clear() 该方法用于清空栈
 * 将top设为0
 */
function clear () {
  this.top = 0
}

三、栈的应用

数制间的相互转换

我们可以利用栈将一个数字从一种数制转换为另一种数制。
假设想将数字n转换为以b为基数的数字,实现的算法如下:

  1. 最高位为 n%b,将此位压入栈。
  2. 使用 n/b 代替n。
  3. 重复步骤1和2,直到n等于0,且没有余数。
  4. 持续将栈内元素弹出,直到栈空,依次将这些元素排列即可。

此算法只针对基数为2-9的情况
代码实现如下:

function mulBase (num, base) {
  let s = new Stack()
  do {
    s.push(num % base)
    num = Math.floor(num /= base)
  } while (num > 0) {
    let converted = ''
    while (s.length() > 0) {
      converted += s.pop()
    }
    return converted
  }
}

回文

使用栈,我们可以判断一个字符串是否为回文。
字符串完整压入栈内后,通过持续弹出栈中的每一个字母就可以得到一个新的字符串,该字符串刚好与原来的字符串顺序相反。我们只需要比较两个字符串即可。如果相等,就是一个回文。

function isPalindrome (word) {
  let s = new Stack()
  for (let i = 0; i < word.length; ++i) {
    s.push(word[i])
  }
  let rword = ''
  while (s.length() > 0) {
    rword += s.pop()
  }
  if (word == rword) {
    return true
  } else {
    return false  
  }
}

结束语

以上就是对JavaScript实现栈的介绍。

参考资料:数据结构与算法JavaScript描述 第4章 栈

Miyang
197 声望10 粉丝

快手前端工程师