js实现栈结构

180 阅读3分钟

一、什么是栈结构

(英语:stack)又称为堆栈堆叠, 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

  栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。

  由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表。

  这里以羽毛球筒为例,羽毛球筒就是一个栈,刚开始羽毛球筒是空的,也就是空栈,然后我们一个一个放入羽毛球,也就是一个一个push进栈,当我们需要使用羽毛球的时候,从筒里面拿,也就是pop出栈,但是第一个拿到的羽毛球是我们最后放进去的。

栈结构.jpg

二、用js数组实现栈结构

用js实现栈结构的方式有很多种,接下来介绍一下用数组实现的方式

1. 首先定义一个栈结构的类

class Stack {
  constructor() {
    this.stack = [];
  }
}

很简单,一个栈结构的class就实现了。其中stack数组就是栈结构,用来存放数据

2. 数据入栈方法

数据进栈很像往数组里push一个元素,实现方式

  put(item) {
    this.stack.push(item);
  }

3. 出栈

栈结构有个特点:先进后出

则对于出栈来说就是数组末尾删除一个元素,则对应的方法就是数组的pop方法

  pop() {
    return this.stack.pop();
  }

4. 查看栈大小

返回数组的长度

  size() {
    return this.stack.length;
  }

5. 查看栈顶元素

注意是查看,元素不需要出栈

 peak() {
    return this.stack[this.stack.length - 1];
  }

6. 清空栈

 clear() {
    this.stack = [];
  }

7. 完整代码

class Stack {
  constructor() {
    this.stack = [];
  }

  // 入栈
  put(item) {
    this.stack.push(item);
  }

  // 出栈
  pop() {
    return this.stack.pop();
  }

  // 栈大小
  size() {
    return this.stack.length;
  }

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

  // 清空栈
  clear() {
    this.stack = [];
  }
}

let stack = new Stack();

stack.put(1);
stack.put(2);
stack.put(3);

console.log(stack.size());
console.log(stack.peak());
console.log(stack.pop());
console.log(stack.peak());
console.log(stack.size());

三、 案例

十进制转二进制

整数转二进制采用"除2取余,逆序排列"

假设我们现在需要将42转为二进制,那我们怎么做呢,如下图所示:

十进制转换二进制.jpg

有没有发现这可以用栈结构实现

  1. 整数取余后入栈
  2. 用上一步取余的整数接着取余
  3. 当最后结果为0时停止入栈
  4. 元素依次出栈然后拼接成字符串输出
function dec2Bin(number) {
  const stack = new Stack();
  // 遍历
  while (number > 0) {
    // 取除二的余数
    let remain = number % 2;
    // 入栈
    stack.put(remain);
    // 进行下一次遍历
    number = Math.floor(number / 2);
  }

  let string = "";
  while (stack.size()) {
    string += stack.pop();
  }
  console.log(string);
}

好了,栈结构就实现了。