版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/killeri/article/details/83031593
栈的一个经典应用就是判断一个文本中的括号,包括小括号,中括号,大括号是不是有缺失,顺序不正确等情况。
栈的类的实现在前面文章中已经实现,我们这里直接应用(用的是顺序表实现的栈)
两种解法:第二种解法有细节
第一种解答法如下:
# _*_ coding:utf-8 _*_
"""
用于检查文本中的括号是不是使用正确,
对于文本中括号的缺少等问题都能够检测
"""
from 栈的顺序表实现 import Stack, StackOverFlow
parensK = "([{"
parensG = ")]}"
parensDict = { ")" : "(", "]" : "[", "}" : "{" }
# 建立一个栈的实例
class Solution:
stack = Stack()
def __init__(self, string):
self.string = string
def check(self):
for char in self.string:
'''
遍历字符串,找出括号字符进行判断
'''
if char in parensK:
self.stack.push(char)
elif char in parensG:
pchar = self.stack.pop()
if parensDict[char] != pchar:
raise StackOverFlow("A not match char")
if not self.stack.is_empty():
raise StackOverFlow("dont shut it down")
string = "({}[()])"
solution = Solution(string)
solution.check()
第二种解法代码如下:
# _*_ coding:utf-8 _*_
"""
一下这个实现方法,利用了栈的存储原理
但是破坏了栈的操作,可以输出整个文本中
所有括号的出现顺序
"""
from 栈的顺序表实现 import Stack, StackOverFlow
def check_parens(text):
"""
括号配对检查函数,text是被检查的文本
"""
parens = "()[]{}"
open_parens = "([{"
opposite = { ")" : "(", "]" : "[", "}" : "{" }
# 用字典来检测
def parentheses(text):
"""
括号生成器,每次调用返回下一次text里的下一个括号及其位置
使用一个生成器来每次调度都会生成text中的下一个括号
"""
i, text_len = 0, len(text)
while True:
while i < text_len and text[i] not in parens:
i += 1
if i >= text_len:
return
yield text[i], i
i += 1
st = Stack()
# 保存括号的栈
for pr, i in parentheses(text):
"""
这里就调用了生成器函数
"""
if pr in open_parens:
st.push(pr)
elif st.pop() != opposite[pr]:
# 这里首先执行st.pop(),所以栈顶的元素一定会被删除
print("Unmatching is found at", i , "for", pr)
return False
print("All parentheses are correctly matched")
return True
check_parens("([]{}())")