通过JavaScript实现Stack数据结构

82 阅读1分钟

通过JavaScript实现Stack数据结构

Intro

Javacript 中本不存在 Stack 堆数据结构,但是在日常开发和刷题过程中,无可避免需要使用到 Stack 进行更加高效的数据处理

什么是Stack

Stack 堆是一个线性的数据结构,支持以先入后出,后入先出的顺序增加删除元素

JavaScript 中使用 Array 实现 Stack

// stack class
class Stack {
  constructor() {
    // 用于实现 stack 的数组
    this.items = [];
  }
  // 用于实现 stack 能力的函数
  // push(item)
  // pop()
  // peek()
  // isEmpty()
  // printStack()
}

通过使用构造器的方式,每次新建一个 Stack 实例都将创建一个对应的数组承载数据

  1. Push 函数向 Stack 顶端推入数据
push(element) {
  this.items.push(element);
}
  1. Pop 函数将 Stack 顶端的数据移除,当没有顶端数据时,返回 undefined(Stack 为空时返回 undefined)
pop() {
  // 返回 Stack 顶端的元素
  // 将其从 Stack 中移除
  // 若 Stack 为空,则返回 undefined
  if(this.items.lengthj == 0)
    return undefined;
  return this.items.pop();
}
  1. Peek 函数将会返回 Stack 顶端的元素,与 Pop 不同的是,将不会移除该元素
peek() {
  return this.items[this.items.length -1];
}
  1. isEmpty 函数用于判断 Stack 是否为空
// 返回 true 则为空
isEmpty() {
  return this.items.length == 0;
}
  1. printStack 函数,通过字符串相连的方式返回 Stack 中的所有元素(也可以通过数组返回输出,不做限定)
printStack() {
  var str = "";
  for (var i = 0; i < items.length; i++) {
    str += this.items[i] + ' ';
  }
  return str;
}
  1. length 函数,获取 Stack 的长度
length() {
  return this.items.length;
}

Example

下面,我们将会使用一些例子来验证我们的 Stack Class 是否可用

// 创建 Stack 实例
var stack = new Stack();

// return true
console.log(stack.isEmpty()); 

// return undefined
console.log(stack.pop()); 

// 向 Stack 中加入元素
stack.push(10);
stack.push(20);
stack.push(30);
  
// 打印 Stack
// prints 10 20 30
console.log(stack.printStack());
  
// returns 30
console.log(stack.peek());
  
// returns 30 并将其移出 Stack
console.log(stack.pop());
  
// returns 10 20
console.log(stack.printStack()); 

Stack 在后缀表达式中的运用

什么是后缀表达式

输入: str = “2 3 1 * + 9 -“ 输出: -4 计算方式:3 * 1 + 2 - 9 计算规则:遇到运算符时将运算符前的两个数字进行运算并暂存,若不存在运算符,或运算符前不具有两个数据,则表达式不成立

function postFixEvaluation(exp){
  for(var i = 0; i < exp.length; i++) {
    var c = exp[i];
    if (!isNaN(c))
      stack.push(c - '0');
    else {
      var val1 = stack.pop();
      var val2 = stack.pop();
      if (val1 == undefined || val2 == undefined)
        return 'invalid postfix evaluation'
      switch(c) {
        case '+':
          stack.push(val1 + val2);
          break;
        case '-':
          stack.push(val1-val2);
          break;
        case '*':
          stack.push(val1 * val2);
          break;
        case '/':
          stack.push(val1  / val2);
          break;
      }
    }
  }
  return stack.pop()
}

// returns 9
console.log(postFixEvaluation("235*+8-")); 
  
// returns invalid postfix evaluation
console.log(postFixEvaluation("23*+"));

使用 Stack 对数组进行翻转

function reverse(str) {
    let stack = new Stack();
    // push letter into stack
    for (let i = 0; i < str.length; i++) {
        stack.push(str[i]);
    }
    // pop letter from the stack
    let reverseStr = '';
    while (stack.length > 0) {
        reverseStr += stack.pop();
    }
    return reverseStr;
}
console.log(reverse('JavaScript Stack')); //kcatS tpircSavaJ

使用 Stack 进行进制转换

function mulBase(num, base) {
  var stack = new Stack();
  var converted = '';
  do {
    stack.push(num%base);
    num = Math.floor(num /= base);
  } while (num > 0)
  while( stack.length() > 0 ) {
    converted += stack.pop()
  }
}

var num = 32;
var base = 2;
var newNum = mulBase(num, Base)
// newNum = 100000