数据结构-栈

1、栈

数据结构-栈_第1张图片

2、栈实现

 //stack构造函数
 class Stack {
    items = [];
    constructor() {
    }
    //元素入栈,返回栈的大小
    push(el) {
      return this.items.push(el);
    }

    //元素出栈,返回出栈元素
    pop() {
      return this.items.pop();
    }
    
    //获取栈顶元素
    getTop() {
      return this.items[this.items.length - 1];
    }
      
    //获取栈的大小
    size() {
      return this.items.length;
    }

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

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

3、应用-数值转换

数据结构-栈_第2张图片

 /***
  * @description 十进制转化为N进制函数
  * @param {Number} metadata 被转化的数值
  * @param {Number} n 指定被转化的进制
  * @returns {string} 
  */
 function binaryConversion(metadata, n) {
    //初始化一个栈对象
    let stack = new Stack();
    let remainder = 0;
    let res = "";
    while(Math.floor(metadata / n) !== 0) {
      //计算余数
      // debugger;
      remainder = metadata % n;

      switch(remainder) {
        case 10:
          remainder = "A";
          break;
        case 11:
          remainder = "B";
          break;
        case 12:
          remainder = "C";
          break;
        case 13:
          remainder = "D";
          break;
        case 14:
          remainder = "E";
          break;
        case 14:
          remainder = "F";
          break;
      }
      
      //余数入栈
      stack.push(remainder);
      //metadata重新赋值
      metadata = Math.floor(metadata / n);
    }
    //最后一次计算余数没有入栈,这里需要加一次入栈操作
    remainder = metadata % n;
    stack.push(remainder);

    //输出最后结果
    while(!stack.isEmpty()) {
      res += stack.pop();
    }
    return res;
 }

4、应用-括号匹配检验

数据结构-栈_第3张图片

/**
 * @description 括号匹配检验:匹配[]、()、{}三种符号是否成对
 * @param {String} metadata
 * @returns {Boolean}
 */

 function bracketMatch(metadata) {
    //先用正则找出metadata中所有的[]、()、{}符号
    let symbolReg = /[\[|\]|\(|\)|\{|\}]/g;
    let symbolArr = metadata.match(symbolReg);
    let stack = new Stack();
    for(item of symbolArr) {
      if (item === "(" || item === "[" || item === "{") {
        stack.push(item);
      }
      if (item === "]") {
        if (stack.getTop() === "[") {
          stack.pop();
        } else {
          stack.push(item);
        }
      }
      if (item === ")") {
        if (stack.getTop() === "(") {
          stack.pop();
        } else {
          stack.push(item);
        }
      }
      if (item === "}") {
        if (stack.getTop() === "{") {
          stack.pop();
        } else {
          stack.push(item);
        }
      }
    }
    if (stack.isEmpty()) {
      return true;
    } else {
      return false;
    }
 }

5、应用-行编辑程序

数据结构-栈_第4张图片

/**
 * @description 检验行输入数据
 */

 function lineEdit(input) {
    let inputArr = input.split("");
    let stack = new Stack();
    let res = "";
    for(item of inputArr) {
      if (item !== "#" && item !== "@" ) {
        stack.push(item);
      } else if (item === "#") {
        stack.pop();
      } else if (item === "@") {
        stack.clear();
      }
    }
    while(!stack.isEmpty()) {
      res += stack.pop()
    }
    return [...res].reverse().join("");
 }

你可能感兴趣的:(进制转换,栈,数据结构与算法)