目 录
1. 栈的应用场景
1.1 实际应用场景
总的来说,栈的运用还是非常广泛的,在实际的编程场景中,支持文本编辑器、字处理程序、电子表格程序、绘图程序或类似的应用程序中的撤销功能,支持维护 Web 浏览器所访问过的连接的历史记录。
1.2 例题分类
常见的例题有下面四种,会依次进行讲解,本章先讲括号匹配。
- 括号匹配
- 数制转换
- 迷宫求解
- 表达式求值
2. 应用场景:括号匹配
2.1 括号匹配例题
例题内容:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
2.2 括号匹配代码实现
2.2.1 未使用栈的代码实现
这部分并没有直接使用栈结构,在依次判断存放了括号列表的元素时候,遇到左右匹配的就从列表中移除,然后不断地对列表进行扫描。
class Solution:
def isValid(self, s: str) -> bool:
left_right={"(":")","{":"}","[":"]"}
s_list=list(s)
s_len=len(s_list)
while(s_len>0):
i=0
found=False
while(i<s_len-1):
if((s_list[i] in left_right) and left_right[s_list[i]]==s_list[i+1]):
found=True
s_list.pop(i)
s_list.pop(i)
break
i+=1
if(not found):
return(False)
s_len=len(s_list)
return(True)
运行结果:
2.2.2 使用栈的代码实现
使用栈时候,只需要在压栈的时候判断一下是否和目前栈顶元素是一对,如果是则双双消除,如果不是和压栈,最后看看栈的长度是不是为0就可以了,相对于不使用栈结构的代码,非常的清晰。
class Solution:
def isValid(self, s: str) -> bool:
stack=Stack()
for tmp in s:
stack.push(tmp)
if(stack.is_empty()):
return(True)
else:
return(False)
class Stack(object):
def __init__(self):
self.stack=[]
self.stack_size=0
self.content={"(":")","{":"}","[":"]"}
# 压栈
def push(self,val):
if(self.stack_size>0):
if((self.stack[-1] in self.content ) and (self.content[self.stack[-1] ]==val)):
self.pop()
return(False)
self.stack.append(val)
self.stack_size+=1
return(True)
# 弹出栈顶元素
def pop(self):
if(self.stack_size==0):
return(None)
else:
self.stack_size-=1
return(self.stack.pop())
# 判断栈是否为空
def is_empty(self):
if(self.stack_size==0):
return(True)
else:
return(False)
# 提供给 print 函数
def __str__(self):
return("This is a stack ==>{0}".format(self.stack))