【栈的抽象数据类型——操作】
Stack() 创建一个空栈。它不需要参数,且会返回返回值
push(item) 将一个元素添加到栈的顶端。它需要一个参数item,且无返回值
pop() 将栈顶端的元素移除。它不需要参数,但会返回顶端的元素,并修改栈的内容
peek() 返回栈顶端元素,但是并不移除该元素。它不需要参数,也不会修改栈的内容
isEmpty() 检查栈是否为空。它不需要参数,且返回布尔值
size() 返回栈中元素的数目。它不需要参数,且会返回一个整数
【题目——简单括号匹配】
True: ((()))、 (()())
False:(()、 ()())
【解题思路】
1.相匹配的右括号与左括号出现的顺序相反(栈)
2.从左到右扫描,最后打开的左括号必须要匹配最先打开的右括号
3.当扫描到右括号时,删除栈顶端的左括号,如果栈中没有元素则返回False
4.如果都没有找到,返回false
【代码实现】
导入栈操作,或者直接写函数
#栈的应用:简单括号匹配
'''
1.每个开括号要恰好对应一个闭括号
2.每对开括号要正确对嵌套
True:(()()())
False:(((())
解题
从左到右扫描括号串==》最后打开的左括号必须要匹配最先打开的右括号
(次序反转)
'''
from pythonds.basic.stack import Stack#导入栈
def parChecker(n):
s=Stack()
balanced=True #表示匹配成功
index=0 #下标
while index<len(n) and balanced:
i=n[index]
if i=="(":
s.push(i)
else:#右括号
if s.isEmpty(): #查找有没有左括号,栈是否为空
balanced=False
else:
s.pop()#删除栈中最上面的'('
index+=1
if balanced and s.isEmpty():
return True
else:#都没有找到
return False
print(parChecker('((()))()()'))#True
print(parChecker('((((())'))#Fals
【题目——复杂括号匹配】
True:{{([])}} []{}
False:([)] ((()])) [{()
比起简单括号匹配,增加了[]、{}
只要在简单括号匹配上增加一点即可
1.首先需要定义一个函数函数,判断左括号是否一致
2.将简单匹配中判断i是否等于"("改为是否等于"({["
3.利用上面写的函数判断栈顶的左括号是否与右括号匹配
【代码实现】
#多种括号匹配
'''
True:{{([])}} []{}
False:([)] ((()])) [{()]
只需要在通用的括号匹配上修改就可以
1.碰到各种左括号依然入栈
2.碰到各种右括号的时候需要判断栈顶的左括号是否跟右括号同个类型
'''
from pythonds.basic.stack import Stack #导入栈包
#定义一个函数,判断左右括号是否一致
def matches(l,r):
left="({["
right=")}]"
return left.index(l)==right.index(r)
def parChecker(n):
s=Stack()
balanced=True #表示匹配成功
index=0 #下标
while index<len(n) and balanced:
i=n[index]
if i in "({[":
s.push(i)
else:#右括号
if s.isEmpty(): #查找有没有左括号,栈是否为空
balanced=False
else:
top=s.pop()#删除栈中最上面的括号
if not matches(top,i):
balanced=False
index+=1
if balanced and s.isEmpty():
return True
else:
return False
print(parChecker('{{([])}}'))#True
print(parChecker('([)]'))#False