0
点赞
收藏
分享

微信扫一扫

数据结构与算法学习(四)栈

北溟有渔夫 2022-04-13 阅读 122

1.栈

1.栈

先进后出,后进先出。类似于一摞盘子,最后放上的盘子,往往先拿出去使用。

  • 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
  • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。
  • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
  • 在入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 O(1)。
  • 不管是顺序栈还是链式栈,入栈、出栈只涉及栈顶个别数据的操作,所以时间复杂度都是 O(1)。

2.存在意义

从功能上来说,数组或链表可以替代栈,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。

当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。

3.如何实现栈

栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,叫作顺序栈,用链表实现的栈,叫作链式栈

// 栈结构的封装(基于数组)
class Stack {
  constructor() {
    this.items = [];
  }

  // push(item) 压栈操作,往栈里面添加元素
  push(item) {
    this.items.push(item);
  }

  // pop() 出栈操作,从栈中取出元素,并返回取出的那个元素
  pop() {
    return this.items.pop();
  }

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

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

  // size() 获取栈中元素个数
  size() {
    return this.items.length;
  }

  // toString() 返回以字符串形式的栈内元素数据
  toString() {
    let result = "";
    for (let item of this.items) {
      result += item + " ";
    }
    return result;
  }
}


// push() 测试
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.items); //--> [1, 2, 3]

// pop() 测试
console.log(stack.pop()); //--> 3

// peek() 测试
console.log(stack.peek()); //--> 2

// isEmpty() 测试
console.log(stack.isEmpty()); //--> false

// size() 测试
console.log(stack.size()); //--> 2

// toString() 测试
console.log(stack.toString()); //--> 1 2

4.栈应用

利用栈结构的特点封装实现十进制转换为二进制的方法。

function dec2bin(dec) {
  // new 一个 Stack,保存余数
  const stack = new Stack();

  // 当不确定循环次数时,使用 while 循环
  while (dec > 0) {
    // 除二取余法
    stack.push(dec % 2); // 获取余数,放入栈中
    dec = Math.floor(dec / 2); // 除数除以二,向下取整
  }

  let binaryString = "";
  // 不断地从栈中取出元素(0 或 1),并拼接到一起。
  while (!stack.isEmpty()) {
    binaryString += stack.pop();
  }

  return binaryString;
}


// dec2bin() 测试
console.log(dec2bin(100)); //--> 1100100
console.log(dec2bin(88)); //--> 1011000
举报

相关推荐

0 条评论