数据结构-前端javascript-栈

82 阅读2分钟

概念

一种具有后入先出(LIFO,last-in-first-out)特点的数据结构,可以参考咖啡或者餐厅内的一摞盘子,只能先从盘子的最顶部去取用(也就是拿出最近一次放置的盘子)。

特点

无法直接获取最底部的元素,如果需要访问底部的元素,需要将其上的元素通过pop()先拿掉

主要方法&属性

  • push:向栈内存放元素
  • pop:从栈内取出并删除最新一个元素
  • peek:从栈内取出最新一个元素
  • clear:清除所有栈内元素
  • empty:判断栈是否为空
  • length:获取栈内元素个数

下图为了方便大家理解栈的工作过程,仅供参考:

Javascript实现

经过上文对栈的描述,我们尝试实现一下栈

function Stack() {  
  this.dataStore = [];  
  this.top = 0;
}
Stack.prototype.push = function (element) {  
  this.dataStore[this.top++] = element;
}
Stack.prototype.peek = function () {  
  return this.dataStore[this.top - 1];
}
Stack.prototype.pop = function () {  
  return this.dataStore[--this.top];
}
Stack.prototype.clear = function () {  
  this.dataStore = [];  
  return this.top = 0;
}
Stack.prototype.length = function () {  
  return this.top;
}
Stack.prototype.empty = function () {  
  return this.top === 0;
}

使用场景

在了解栈的基本概念之后我们再了解一下栈的主要使用场景,毕竟单纯的概念理解对我们来说意义不大,只有在实际场景中尝试或者运用后才会有更深的理解,尤其对于大部分前端同学来说,使用这种数据结构好像会增加日常开发的负担,因为js中提供了数组,而数组的方法和特性完全覆盖了**栈。**下面将介绍栈的一些使用场景。

1、数制间的相互转换(只针对基数为 2~9 的情况)

可以利用栈将一个数字从一种数制转换成另一种数制,具体步骤如下:

  1. 最高位为 n % b,将此位压入栈。

  2. 使用 n/b 代替 n。

  3. 重复步骤 1 和 2,直到 n 等于 0,且没有余数。

  4. 持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符

    串形式。 

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

2、判断回文或者括号匹配

function isPalindrome(word) {  
  const s = new Stack();  
    for (var i = 0; i < word.length; ++i) {    
    s.push(word[i]);  
  }  
  const rword = ""; 
    while (s.length() > 0) {    
    rword += s.pop();  
  }  
  return word == rword;
}

3、浏览器的前进后退

总结

对于前端同学日常开发来说,栈的实际使用场景并不多,但是了解栈的数据结构有助于拓展我们的思维,也是学习数据结构和算法的基础。