【问题标题】:Balancing Parenthesis Algorithm Using Stacks使用堆栈平衡括号算法
【发布时间】:2020-06-18 23:08:56
【问题描述】:

所以我正在学习目前正在研究堆栈、队列和 Dequeus 的数据结构和算法

我有这个问题说我应该实现一个堆栈来检查给定的字符串是否具有平衡括号,并且我在问题中被告知字符串包含only 括号并且字符串具有no spaces

所以我确实实现了我的 Stack 类,然后尝试解决问题 Checking if the Parenthesis balance,我做了一个简单的测试用例 '[]',它返回 False 而不是 True 所以我没有发现代码中的错误。

以下是我解决问题的思考过程,以便您清楚地看到我可能出错的地方:

  1. 首先我检查了字符串的长度是否即使不是我返回False

  2. 我扫描字符串,每次看到左括号时,我都会将它推入堆栈

  3. 然后,当我看到一个右括号时,我会使用 LIFO 的堆栈知识,我知道如果现在我看到一个右括号,前一个应该是相应的开口,它是最后一个被推入堆栈的项目,所以我然后将其从堆栈中弹出并保存到变量中

  4. 然后我检查它们是否对应,如果不对应,我返回False

  5. 然后我检查堆栈是否为空然后我知道没有相应的左括号我返回False

  6. 最后,如果循环结束而没有任何返回,我检查堆栈是否为空,我返回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


【解决方案1】:

伟大的尝试。你非常亲近。只是几个问题或错别字。

  1. remove_item() 从列表中删除了该项目,但没有返回。
  2. 奇/偶校验由 % 2 == 1 完成,而不是 % 3
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.items)-1]
    def remove_item(self):
        # you were not returning here
        return self.items.pop()

stack = Stack()

def balance_check(s):
    # odd/even check is done like this, not by % 3
    if len(s) % 2 == 1:
        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

    # simplified return
    return stack.get_size() == 0


print(balance_check('{[]{()}}'))

您可以添加更多快速检查,例如:

  1. 如果字符串以右括号开头,则返回 False
  2. 如果字符串以左括号结尾,则返回 False

【讨论】:

    【解决方案2】:

    你的算法是错误的,因为这不是一个有效的字符串:"]]]][[[["

    相反,每次你看到一个开括号,你压入堆栈,一个闭括号被弹出,如果在字符串耗尽之前长度为0,答案是“假”,如果长度不为零时字符串用尽,答案是“假”。否则,“真”。

    【讨论】:

    • "]]]][[[[" 被算法返回为False
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2021-01-14
    • 2017-06-10
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多