【问题标题】:Implementing stack with python to validate braces用python实现栈来验证大括号
【发布时间】:2013-12-08 22:24:05
【问题描述】:

我编写了一个 python 脚本来检查大括号的有效性。我实现了堆栈,对于每个'{'我都会进行堆栈推送操作,对于每个'}'我都会进行堆栈弹出并查看它是否为空。但我无法弄清楚我的代码有什么问题。

class Stack(object) : 
  def __init__(self) : 
    self.items = [] 

  def push(self, item) : 
    self.items.append(item) 

  def pop(self) : 
    return self.items.pop() 

  def isEmpty(self) : 
    return (self.items == [])

  def getStack(self) :
    return self.items

def check_braces(file_data):
    stack = Stack()
    for char in file_data:
        if char == '{':
            stack.push('{')
            #print stack.getStack()
        if char == '}':
            stack.pop()
            #print stack.getStack()
            if stack.isEmpty():
                #print stack.isEmpty()
                return 'braces are valid'
    return 'braces are invalid'

myData = ['{', 'a:', '"1",', 'b:', '{', 'a:', '"2",', 'b:', '{', 'a:', '"7",', 'b:', '{', 'a:', '"14"', '}', '}', '},', 'b:', '{', 'a:', '"3",', 'b:', '{', 'a:', '"8"', '},', 'b:', '{', 'a:', '"9"', '}', '},', 'b:', '{', 'a:', '"4",', 'b:', '{', 'a:', '"10"', '},', 'b:', '{', 'a:', '"11",', 'b:', '{', 'a:', '"15"', '}', '}', '},', 'b:', '{', 'a:', '"5"', '},', 'b:', '{', 'a:', '"6",', 'b:', '{', 'a:', '"12"', '},', 'b:', '{', 'a:', '"13",', 'b:', '{', 'a:', '16', '},', 'b:', '{', 'a:', '17', '},', 'b:', '{', 'a:', '18', '}', '}', '}', '}']

print check_braces(myData)

【问题讨论】:

  • 好吧,它有什么问题? (我投了反对票,因为这没有提供示例输入和预期/实际结果。)至少有一个错误是 stack.pop() 可能在空堆栈上被调用。
  • 根据您的代码,{}{{{{ 将是有效的,因为在第一个(也是唯一一个)} 之后,堆栈为空。您必须检查两种情况:您尝试从空堆栈中弹出 -> 无效。最后一个输入项后,栈不为空->无效。

标签: python list stack


【解决方案1】:

正如我在评论中所说,您必须检查两种情况:

class Stack (list):
        def push (self, x):
                return self.append (x)

def check_braces (data):
        stack = Stack ()
        for c in data:
                if c == '{':
                        stack.push (c)
                if c == '}':
                        if not stack: return False #First case: too many closing
                        stack.pop ()
        return not stack #Second case too many opening

print (check_braces ('{}}') )
print (check_braces ('{{}') )
print (check_braces ('{}{') )
print (check_braces ('}{}') )
print (check_braces ('{}{}{{}}') )

但由于堆栈唯一重要的是它的深度,您可以简单地使用:

def check_braces (data):
        depth = 0
        for c in data:
                if c == '{':
                        depth += 1
                if c == '}':
                        if not depth: return False
                        depth -= 1
        return depth == 0

【讨论】:

  • 感谢您的回复!尽管您的回答对我有帮助,但它并不能完全回答我的代码与给定输入数据的问题。这就是为什么我不得不接受其他答案(并支持你的)。但是我将在我的代码中使用这个逻辑 =)
  • 请记住,最严厉的说法是不正确的:“您的代码非常好”。如果您使用myData = ['{', '}', '}'],您的代码会显示“大括号有效”,尽管它们显然不是。
  • 是的!我知道 ;-) 我在 cmets 中看到了你的例子,我意识到我的代码中的错误。现在我正在修改它
【解决方案2】:

您的代码非常好,但您的输入 (myData) 有问题。

改用下面的 -

myData = ['{', 'a:', '"1",', 'b:', '{', 'a:', '"2",', 'b:', '{', 'a:', '"7",', 'b:', '{', 'a:', '"14"', '}', '}', '}', 'b:', '{', 'a:', '"3",', 'b:', '{', 'a:', '"8"', '}', 'b:', '{', 'a:', '"9"', '}', '}', 'b:', '{', 'a:', '"4",', 'b:', '{', 'a:', '"10"', '}', 'b:', '{', 'a:', '"11",', 'b:', '{', 'a:', '"15"', '}', '}', '}', 'b:', '{', 'a:', '"5"', '}', 'b:', '{', 'a:', '"6",', 'b:', '{', 'a:', '"12"', '}', 'b:', '{', 'a:', '"13",', 'b:', '{', 'a:', '16', '}', 'b:', '{', 'a:', '17', '}', 'b:', '{', 'a:', '18', '}', '}', '}', '}']

您的输入中很少有 '},' 条目,应该是 '}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2021-12-11
    • 1970-01-01
    • 2021-10-11
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多