栈
- 栈
线性表描述数据如何存放,栈描述数据如何进行操作。
栈(stack)只允许元素在一端(栈顶,top)进行加入数据(push)和推出数据(pop)的运算,后进先出(LIFO,Last In First Out)。比如:浏览器的后退按钮,word中的撤销。
- 栈结构的实现
栈可以用顺序表,也可以用链表。
使用顺序表,在尾部插入和删除,时间复杂度低,都是O(1)。
栈的操作:
- Stack()创建一个空栈
- push(item)压栈,添加新元素到栈顶
- pop()出栈,弹出栈顶元素
- peek()返回栈顶元素
- is_empty()判断栈是否为空
- size()返回栈的元素个数
class stack: #使用顺序表
def __init__(self): #构造一个list容器
self.__list = []
def push(self,item):
self.__list.append(item)
def pop(self):
return self.__list.pop()
def peek(self):
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
return self.__list == []
def size(self):
return len(self.__list)
- 栈的应用
(1)简单括号匹配,判断括号是否能正确匹配
用栈,循环括号,如果是左括号,就入栈,如果进入右括号并且栈非空,就把栈顶左括号推出,如果栈空,就输出不匹配。如果循环完后栈是空的,则匹配。
优化:判断字符串个数若为奇数,则肯定不匹配;栈如果超过字符串的一半,则也不匹配。
def isValid(self, s: str) -> bool:
a=[]
if len(s)%2!=0:
return False
i=0
while i < len(s) and len(a)<=len(s)/2:
if s[i]=='(' or s[i]=='{' or s[i]=='[':
a.append(s[i])
i+=1
else:
if a==[]:
return False
elif s[i]==')' and a[-1]=='(':
a.pop()
i+=1
elif s[i]=='}' and a[-1]=='{':
a.pop()
i+=1
elif s[i]==']' and a[-1]=='[':
a.pop()
i+=1
else: return False
if a==[]:
return