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;
}
posted on 2021-03-13 16:38  李起桉  阅读(52)  评论(0编辑  收藏  举报