1.概念
是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
生活中基于栈的经验有:托盘,邮件消息等。具体图解如下图所示。
2.自定义栈的完整操作
// 栈类 function Stack() { // 栈中的属性 var items = []; // 栈相关的方法 // 压栈操作 this.push = function (element) { items.push(element); }; // 出栈操作 this.pop = function () { return items.pop(); }; // peek操作 this.peek = function () { return items[items.length - 1]; }; // 判断栈中的元素是否为空 this.isEmpty = function () { return items.length == 0; }; // 获取栈中元素的个数 this.size = function () { return items.length; }; }
3.使用栈来实现十进制转二进制
// 封装十进制转二进制的函数 function dec2bin(decNumer) { // 定义变量 var stack = new Stack(); var remainder; // 循环除法 while (decNumer > 0) { remainder = decNumer % 2; decNumer = Math.floor(decNumer / 2); stack.push(remainder); } // 将数据取出 var binayrString = ""; while (!stack.isEmpty()) { binayrString += stack.pop(); } return binayrString; }
4.判断一个序列是否为合理的出栈顺序
// pushV是入栈顺序的数组,popV是要判断的出栈顺序数组 function IsPopOrder(pushV, popV) { const stack = []; pushV.forEach(item => { if (item === popV[0]) { popV.shift(); while(stack.length && stack[stack.length - 1] === popV[0]) { stack.pop(); popV.shift(); } } else { stack.push(item); } }) return !stack.length && !popV.length; }