javascript实现数据结构 --- 栈

栈类

特点:后进先出 LIFO(类似往箱子里放碟好的衣服,取衣服)

下划线开头的为私有变量,请不要随意更改

关于私有变量:

  • 下划线命名约定
  • 使用symbol,Object.getOwnPropertySymbol可以获取元素
  • 使用WeakMap,key为对象,弱引用
/**
 * 栈
 * 特点:后进先出 LIFO(类似往箱子里放碟好的衣服,取衣服)
 * 
 * add(element):添加一个或多个新元素到栈顶
 * delete:移除栈顶元素,返回被移除的元素
 * query:返回栈顶元素
 * isEmpty:判断是否为空
 * clear:清空栈
 * size:返回栈里元素的长度
 * 
 * @class Stack
 */
class Stack {
  constructor(){
    this._item = [];
  }

  add(ele){
    this._item.push(ele);
  }
  
  delete(){
    return this._item.pop();
  }

  query(){
    return this._item[this._item.length - 1];
  }

  isEmpty(){
    return this._item.length === 0;
  }

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

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

// 测试
const stack = new Stack();
console.log(stack.isEmpty()); // true

stack.add(5);
stack.add(8);
console.log(stack.query()); // 8

stack.add(11);
console.log(stack.size()); // 3
console.log(stack.isEmpty()); // false

stack.add(15);
stack.delete();
stack.delete();
console.log(stack.size()); // 2

使用到数组API的源码

// push 源码
Array.prototype.push = function (...items) {
  let O = Object(this);  // ecma 中提到的先转换为对象
  let len = this.length >>> 0;
  let argCount = items.length >>> 0;
  // 2 ^ 53 - 1 为JS能表示的最大正整数
  if (len + argCount > 2 ** 53 - 1) {
    throw new TypeError("The number of array is over the max value")
  }

  for (let i = 0; i < argCount; i++) {
    O[len + i] = items[i];
  }

  let newLength = len + argCount;
  O.length = newLength;

  return newLength;
}

// pop 源码
Array.prototype.pop = function() {
  let O = Object(this);
  let len = this.length >>> 0;
  if (len === 0) {
    O.length = 0;
    return undefined;
  }

  len--;
  let value = O[len];
  delete O[len];
  O.length = len;

  return value;
}

栈的运用(进制转换)

// 进制转换
const baseCouverter = (decNumber, base) => {
  const remStack = new Stack();
  const digits = '0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ';
  let num = decNumber;
  let rem = 0;
  let baseString = '';

  if(!(base >= 2 && base <= 36)){ return '该进制不是转换区域2~36'; }

  while(num > 0){
    rem = (num % base) | 0;
    remStack.add(rem);
    num = (num / base) | 0;
  }

  while(!remStack.isEmpty()){
    baseString += digits[remStack.delete()];
  }

  return baseString;
}

console.log(baseCouverter(100345, 2));
console.log(baseCouverter(100345, 8));
console.log(baseCouverter(100345, 16));
console.log(baseCouverter(100345, 35));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值