堆栈是一种数据结构,类似于往长宽都是乒乓球直径的乒乓球盒子里放乒乓球,先放进去的后面才能取出来,有先进后出的性质。也就是它的一端是浮动的,另一端是固定的,数据的插入删除都必须在浮动的一端进行,所以它严格遵循“先进后出,后进先出”的规律。
为了能能够很快的匹配三种括号的左右两边,采用哈希表来存储括号,例如可以把左边 “{” 设为key,把右边 “}” 设为value。建立 mapping = {"{":"}", "(":")", "[":"]"}
。
由于堆栈存在边界问题,所以要在里面先加一个字符,可以避免以后出现的很多麻烦。
我们的思路就是,先检查一个字符是否是哈希表中的一个key,如果是,则把它放入栈中,如果不是,则要将栈顶的元素取出,然后判断这个栈顶元素为key时,value的值是否为该字符,if mapping.get(top_element) is not char :
如果不是,则返回false。循环所有的字符。
循环结束后,我们最后要检查的就是这个栈中的元素最后是否为1,如果是1,则我们所有的括号都是匹配的,如果不是1,则不匹配,返回false。
我们都知道,匹配的括号一定是双数个,所以我们会先判断一下括号的单双数,如果是单数,直接返回false就可以啦。具体的python3代码如下:
*堆栈的区别:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;例如:char *p = new char[5]指针p 存放在栈中,栈主要用于存放函数的参数值、局部变量等。堆由开发人员分配和释放, 若开发人员不释放,new出来的内容放置在堆中。
*(2)数据结构场景下,堆与栈表示两种常用的数据结构。我们用到的就是这种数据结构啦~**
class Solution:
def isValid(self, s: str) -> bool:
"""
:type s: str
:rtype: bool
"""
stack = []
mapping = {}
stack.append("?")
a = len(s)%2
if len(s) % 2 is not 0:
return False
mapping = {"{":"}", "(":")", "[":"]"}
for char in s:
a = mapping.get(char)
if char in mapping.keys():
stack.append(char)
else:
top_element = stack.pop()
if mapping.get(top_element) is not char:
return False
while len(stack) is 1:
return True
else:
return False