JavaScript 数据结构与算法 之 栈

简介: JavaScript 数据结构与算法 之 栈

栈结构

栈是一种遵从后进先出( LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。
  1. 创建基于数组的栈
class Stack {
  constructor() {
    this.items = [];
  }
  // 元素进栈
  push(item) {
    this.items.push(item);
  }
  // 元素出栈
  pop() {
    return this.items.pop();
  }
  // 查看栈顶元素
  peek() {
    return this.items[this.items.length - 1];
  }
  // 检查栈是否为空
  isEmpty() {
    return this.items.length === 0;
  }
  // 返回栈的长度
  size() {
    return this.items.length;
  }
  // 清空栈元素
  clear() {
    this.items = [];
  }
}

const stack = new Stack();
console.log(stack.isEmpty()); // 输出true
stack.push(5);
stack.push(8);
console.log(stack.peek()); // 输出8
stack.push(11);
console.log(stack.size()); // 输出 3
console.log(stack.isEmpty()); // 输出 false
stack.push(15);
stack.pop();
stack.pop();
console.log(stack.size()); // 输出 2

JS对象实现Stack类

class Stack {
  constructor() {
    this.count = 0;
    this.items = {};
  }
  push(item) {
    this.items[this.count] = item;
    this.count++;
  }
  pop() {
    if (this.isEmpty()) {
      return undefined;
    }
    this.count--;
    const result = this.items[this.count];
    delete this.items[this.count];
    return result;
  }
  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.count - 1];
  }
  clear() {
    this.items = {};
    this.count = 0;
  }
  size() {
    return this.count;
  }
  isEmpty() {
    return this.count === 0;
  }
  toString() {
    if (this.isEmpty()) {
      return '';
    }
    let objString = `${this.items[0]}`;
    for (let i = 1; i < this.count; i++) {
      objString = `${objString},${this.items[i]}`;
    }
    return objString;
  }
}

保护数据结构内部元素

  • 使用下划线命名约定
class Stack {
  constructor() {
    this._count = 0;
    this._items = {};
  }
}
  • 使用限定作用域Symbol实现类
Object.getOwnPropertySymbols 方法能够取到类里面声明的所有 Symbols 属性,这种方法还是不安全
const _items = Symbol('stackItems');
class Stack {
  constructor() {
    this[_items] = {};
  }
}
  • WeakMap实现
const _items = new WeakMap();
class Stack {
  constructor() {
    items.set(this, []);
  }
  push(item) {
    const s = items.get(this);
    s.push(item);
  }
  pop() {
    const s = items.get(this);
    const r = s.pop();
    return r;
  }
  // ...
}

栈应用

  • 进制转换

    • 十进制转二进制
    function decimalToBinary(decNumber) {
      const remStack = new Stack();
      let number = decNumber;
      let rem;
      let binaryString = '';
      while (number > 0) {
        rem = Math.floor(number % 2);
        remStack.push(rem);
        number = Math.floor(number / 2);
      }
      while (!remStack.isEmpty()) {
        binaryString += remStack.pop().toString();
      }
      return binaryString;
    }
    • 任意进制转换(2~36)
    function baseConverter(decNumber, base) {
      const remStack = new Stack();
      const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      let number = decNumber;
      let rem;
      let baseString = '';
    
      if (!(base >= 2 && base <= 36)) {
        return '';
      }
      while (number > 0) {
        rem = Math.floor(number % base);
        remStack.push(rem);
        number = Math.floor(number / base);
      }
      while (!remStack.isEmpty()) {
        baseString += digits[remStack.pop()];
      }
      return baseString;
    }
相关文章
|
8天前
|
存储 JavaScript 前端开发
什么是堆?什么是栈?他们之间从区别和联系
什么是堆?什么是栈?他们之间从区别和联系
24 0
|
4天前
|
存储
栈与队列练习题
栈与队列练习题
|
4天前
|
存储 索引
操作数栈的字节码指令执行分析
操作数栈的字节码指令执行分析
|
4天前
|
JavaScript 前端开发 算法
【JavaScript技术专栏】使用JavaScript实现常见算法
【4月更文挑战第30天】本文介绍了如何使用JavaScript实现常见算法,包括排序、搜索和图算法。首先,通过JavaScript的`sort`方法讨论了排序算法,以快速排序为例展示了自定义排序的实现。接着,探讨了二分查找这一高效的搜索算法,并提供了实现代码。最后,解释了深度优先搜索(DFS)图算法,并给出了在JavaScript中的实现。理解并运用这些算法能有效提升编程能力。
|
4天前
|
算法 C++
D1. Range Sorting (Easy Version)(单调栈+思维)
D1. Range Sorting (Easy Version)(单调栈+思维)
|
4天前
|
人工智能
线段树最大连续子段板子😂单调栈
线段树最大连续子段板子😂单调栈
|
4天前
数据结构第四课 -----线性表之栈
数据结构第四课 -----线性表之栈
|
5天前
|
存储
栈数据结构详解
栈(stack)是一种线性数据结构,栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶 (top)。本文是对堆结构的通透介绍
|
5天前
|
存储 前端开发 JavaScript
【Web 前端】JS中的栈和堆是什么?优缺点?
【4月更文挑战第22天】【Web 前端】JS中的栈和堆是什么?优缺点?
|
5天前
|
存储 Java
数据结构奇妙旅程之栈和队列
数据结构奇妙旅程之栈和队列