【发布时间】:2020-06-18 23:08:56
【问题描述】:
所以我正在学习目前正在研究堆栈、队列和 Dequeus 的数据结构和算法
我有这个问题说我应该实现一个堆栈来检查给定的字符串是否具有平衡括号,并且我在问题中被告知字符串包含only 括号并且字符串具有no spaces
所以我确实实现了我的 Stack 类,然后尝试解决问题 Checking if the Parenthesis balance,我做了一个简单的测试用例 '[]',它返回 False 而不是 True
所以我没有发现代码中的错误。
以下是我解决问题的思考过程,以便您清楚地看到我可能出错的地方:
首先我检查了字符串的长度是否即使不是我返回
False我扫描字符串,每次看到左括号时,我都会将它推入堆栈
然后,当我看到一个右括号时,我会使用 LIFO 的堆栈知识,我知道如果现在我看到一个右括号,前一个应该是相应的开口,它是最后一个被推入堆栈的项目,所以我然后将其从堆栈中弹出并保存到变量中
然后我检查它们是否对应,如果不对应,我返回
False然后我检查堆栈是否为空然后我知道没有相应的左括号我返回
False最后,如果循环结束而没有任何返回,我检查堆栈是否为空,我返回
True,否则我返回False
代码如下
class Stack(object):
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == 0
def get_size(self):
return len(self.items)
def push(self, data):
self.items.append(data)
def peek(self):
return self.items[len(self)-1]
def remove_item(self):
self.items.pop()
stack = Stack()
def balance_check(s):
if len(s) % 3 == 0:
return False
openings = set('({[')
matches = set([ ('{', '}') , ('(', ')') , ('[', ']') ])
for paren in s:
if paren in openings:
stack.push(paren)
else:
if stack.get_size() == 0:
return False
last_open = stack.remove_item()
if (last_open, paren) not in matches:
return False
if stack.get_size() == 0:
return True
print(balance_check('[]'))
【问题讨论】:
-
len(s) % 3 == 0正在检查长度是否为 3 的倍数,而不是它是偶数...无论如何这不是必要的检查,堆栈会检测到任何缺乏平衡。跨度> -
len(s) % 3 == 0检查长度是否可以除以 3,而不是偶数。 -
remove_item什么都不返回(实际上是“无”)。
标签: python algorithm data-structures