栈判断字符串是否为中心对称_数据结构 Stacks 栈

除了数组以外,栈【Stacks】和队列【Queues】就是和数组有些类似,但是拥有更多形式来添加和删除元素的数据结构,这篇来讨论栈。

栈是一个遵循后进先出【Last In First Out】的有序集合,最先进栈的元素叫做base,最后进的元素叫做top。

生活中栈的例子比如说公寓楼里的电梯,最后进去的人最先出来。在计算机中比如浏览器的前进和后退功能的实现,以及在Chrome浏览器Devtool工具查看调用栈,都是用到了栈。

定义一个完整的堆栈类 【Stack class】

function Stack(){
  let items = [];
  
  this.push = function(element){    // 给堆栈的top上面添加一个元素
    items.push(element);
  };
  
  this.pop = function(){             // 移除top的元素,并返回被移除的元素
    return items.pop();
  };

  this.peek = function(){             // 不修改,只返回top元素
    return items[items.length-1];
  };

  this.isEmpty = function(){           // 判断是否为空,返回布尔值
    return items.length == 0;
  };
 
  this.size = function(){              // 返回元素个数
    return items.length;
  };

  this.clear = function(){             // 清空元素
    items=[];
  };

  this.print = function(){              // 帮助打印出堆栈里面的内容
    console.log(items.toString());
  };
}

使用堆栈类 【Stack class】

定义好堆栈类之后,我们就通过例子来看如何使用堆栈类。

首先要初始化实例

let stack = new Stack();
console.log(stack.isEmpty()); // true

然后我们往堆栈里面添加几个元素

stack.push(5);
stack.push(8);

console.log(stack.peek()); // 8 返回top元素

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

stack.push(15);

下面这幅图展示了我们添加元素的过程

栈判断字符串是否为中心对称_数据结构 Stacks 栈_第1张图片

然后我们再调用 pop 方法移除两个元素

stack.pop();
stack.pop();
console.log(stack.size()); //  2
stack.print(); //  [5, 8]

下面这幅图展示了我们移除元素的过程

栈判断字符串是否为中心对称_数据结构 Stacks 栈_第2张图片

力扣题目练习【Leetcode】

关于栈的题目可以先做20,155,232,844,224,682,496。可以过滤选择得到 https://leetcode-cn.com/tag/stack/ 列表,这里分析题目20

20. 有效的括号
给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。
根据输入输出看出,意思是如果字符串左右两边完全对称,就返回true,否则返回false

推荐在Chrome浏览器里面添加snippet添加和调试代码,可以自在地添加断点和打印语句,比较容易分析问题。

栈判断字符串是否为中心对称_数据结构 Stacks 栈_第3张图片

具体思路(以输入"(}"为例):

1 初始化一个空数组 stack[]

2 循环遍历字符串s,如果s[i]符合【左半边】的符号 ( [ { 这三者之一,就给数组 stack 添加其对应的【右半边】的符号。

isValid("(}") 第一个循环执行后,数组 stack 的内容为一个右括号 [")"]

3 第二次遍历字符串,此时 s[i] 为右大括号 "}",不符合任何一个 case 条件,所以走 default

4 default 条件里面判断 stack.pop() 是否严格等于 s[i],不等于则返回false

此时 s[i] 即第二个元素是右大括号,而 stack.pop() 返回的是右圆括号,所以这不是一个有效的字符串

5 返回true的情形同理可以分析得到啦~

下节介绍和栈十分类似的队列

你可能感兴趣的:(栈判断字符串是否为中心对称)