170 阅读2分钟

栈定义

  • 栈是一种线性结构,可以用装羽毛球的筒子类比,先入后出(FILO).
  • 特点: 最早进入的元素存放的位置叫做栈底, 最后进入的元素存放的位置叫做栈顶.
  • 表现形式: 栈这种数据结构可以用数组来实现,也可以用链表来实现.
  • 入栈: 入栈操作就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会成为新的栈顶.
  • 出栈: 出栈操作就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素的前一个元素将会成为新的栈顶。

栈的相关操作(使用数组模拟)

function Stack(){
    this.items = [];
    
    // 入栈操作
    Stack.prototype.push = function(item){
        this.items.push(item);
    }
    
    // 出栈操作
    Stack.prototype.pop = function(){
        return this.items.pop();
    }
    
    // 栈是否为空
    Stack.prototype.isEmpty = function(){
        return this.items.length == 0;
    }
    
    // 栈长度
    Stack.prototype.size = function(){
        return this.items.length;
    }
    
    // 打印栈数据
    Stack.prototype.toString = function(){
        let str = '';
        for (let index = 0; index < this.items.length; index++) {
          const item = this.items[index] + ' ';
          str += item;
        }
        return str;
    }
}

应用

题目

  • 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效(来自leetCode)

解题思路

  • 首先创建了一个数组,内部存储了所有的可能性['{}', '[]', '()']
  • 把传入的字符串转成集合,然后遍历获取每一个元素,同时判断当前元素和栈顶的元素拼接,然后去可能性数组中查询是否存在
  • 如果存在就说明是一个正确的字符串,那么直接把栈顶的元素从栈中移除
  • 如果不是正确的字符串,就加入到栈中
  • 最后判断,如果栈中有元素存在,那就肯定是不合标准的字符串。

代码实现

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let stack = [];
    let resArr = s.split('');
    if (resArr.length <= 1) return false;
    let allResult = ['()', '[]', '{}'];
    for(let i=0; i<resArr.length; i++){
      if (stack.length === 0) {
        stack.push(resArr[i]);
      }else{
        let current = stack[stack.length - 1];
        let appent = current + resArr[i];
        if (allResult.indexOf(appent) != -1) {
          stack.pop();
        }else{
          stack.push(resArr[i]);
        }
      }
    }
    return stack.length === 0;
};