一、栈
栈又名堆栈,是一种运算受限的线性表。仅允许在表的一端进行插入和删除运算,允许进行插入和删除操作的一端称为栈顶,另一端称为栈底
二、复杂度分析
栈属于常见的一种线性结构,对于进栈和退栈而言,时间复杂度都为O(1)
三、用栈实现检查括号是否匹配
(1)用列表充当栈
(2)列表有pop方法默认弹出列表末尾的最后一个元素
(3)raise抛出异常
(4)思想:判断字符串的每个元素,如果是左括号入栈,如果是右括号,先判断栈是否为空,如果栈为空,则无法出栈,说明不匹配,如果不空,出栈,也就是去掉栈中的一个左括号。将这个字符串的所有元素都处理完之后,在判断这个栈是否为空,如果为空,说明匹配,如果不为空,说明栈中还有左括号未得到匹配,说明不匹配
class Stack:
def __init__(self,length):#默认属性,出生就有
self.length=length #栈的长度
self.elemlist = []
#入栈,判断栈满
def pushelem(self,elem):
if len(self.elemlist)>=self.length:
raise IndexError("栈已满")
elif elem=='(':
self.elemlist.append(elem)
# print(elem)
#出栈,判断栈空
def popelem(self):
if self.elemlist:
self.out=self.elemlist.pop()
else:
raise IndexError("栈已空")
#输出栈顶元素
def topelem(self):
if self.elemlist:
return self.elemlist[-1]
#判断栈空
def noelem(self):
return not bool(self.elemlist)
#栈的大小
def lenelem(self):
return len(self.elemlist)
#处理括号
def judgestack(charelem):
nstack = Stack(len(charelem))
for i in range(len(charelem)):
if charelem[i]=='(':
nstack.pushelem(charelem[i])
elif charelem[i]==')':
if nstack.noelem():#(1)关键
return False
else:
nstack.popelem()
return nstack.noelem()#(2)关键
if __name__=='__main__':
charlist=['((()))','((())','(()))']
for elem in charlist:
print(elem+str(judgestack(elem)))