概念
一种具有后入先出(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 的情况)
可以利用栈将一个数字从一种数制转换成另一种数制,具体步骤如下:
-
最高位为 n % b,将此位压入栈。
-
使用 n/b 代替 n。
-
重复步骤 1 和 2,直到 n 等于 0,且没有余数。
-
持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符
串形式。
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、浏览器的前进后退
总结
对于前端同学日常开发来说,栈的实际使用场景并不多,但是了解栈的数据结构有助于拓展我们的思维,也是学习数据结构和算法的基础。