栈结构

91 阅读2分钟

栈结构

学习栈结构之前,补充数组结构. 比如java的ArrayList)

  • 常见语言的数组不能存放不同的数据类型,因此所有在封装时通常存放在数组中的是Object类型
  • 常见语言的数组容量不会自动改变.(需要进行扩容操作)
  • 常见语言的数组进行中间插入和删除操作性能比较低

数组是一种线性结构, 并且可以在数组的任意位置插入和删除数据. 但是有时候我们为了实现某些功能, 必须对这种任意性加以限制. 而栈和队列就是比较常见的受限的线性结构

认识栈结构

image.png

栈(stack),它是一种受限的线性表,后进先出LIFO

  • 限制是仅允许在其一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
  • LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间.类似于自动餐托盘,最后放上的托盘,往往先把拿出去使用
  • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素
  • 从一个栈删除元素又称作出栈、弹栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈面试题

image.png

正确答案: C

C选项的剖析:

  • 先依次压入: 6 5 4 3
  • 3出 4出 6不能出,5在栈顶

栈结构的封装-js

function Stack() {
    // 栈中的属性
    this.items = [];

    // 栈的操作
    // 1.将元素压入栈
    Stack.prototype.push = function (element) {
      this.items.push(element);
    };

    // 2.从栈中取出元素 (删除栈顶元素,返回被删除的对象)
    Stack.prototype.pop = function () {
      return this.items.pop();
    };

    // 3.查看栈顶元素
    Stack.prototype.peek = function () {
      return this.items[this.items.length - 1];
    };

    // 4.判断栈是否为空
    Stack.prototype.isEmpty = function () {
      return this.items.length === 0;
    };

    // 5.获取栈中元素的个数
    Stack.prototype.size = function () {
      return this.items.length;
    };

    // 6.toString方法
    Stack.prototype.toString = function () {
      var arrStr = "";
      for (const item of this.items) {
        arrStr += item + " ";
      }
      return this.items.toString();
    };
}

// 栈的使用
// var s = new Stack();
// s.push(13);
// s.push(153);
// s.push(99);
// alert(s);

// s.pop();
// s.pop();
// alert(s);

// alert(s.peek);
// alert(s.isEmpty());
// alert(s.size());

// 封装函数: 将十进制转为二进制
function dec2bin(decNumber) {
var stack = new Stack();

while (decNumber > 0) {
  // 获取余数,放入到栈中
  stack.push(decNumber % 2);
  // 获取整除后的结果,作为下一次的值
  decNumber = Math.floor(decNumber / 2);
}

var binStr = "";
while (!stack.isEmpty()) {
  binStr += stack.pop();
}

return binStr;
}

const result = dec2bin(10);
alert(result);