试图用Python堆栈停止错误(Trying to stop an error with Stack

2019-09-26 13:54发布

我试图做一个程序,检查,以确保该文本在括号中的条款平衡(所以()[] {}而不是(),[{})。 我可以得到它时,它是平衡的工作,并在当它缺少一个右括号(就像前面的例子),但不均衡。 我不能让它做的是回来的不均衡,如果我失去了一个托架左侧(()],{})。 我知道它正试图从一个空栈弹出,但无法弄清楚如何应对行动这一点。 我的老师有在她的Stack类,如果它试图弹出一个空栈,那么一个异常会自动升起,我不能改变她的课,这就是问题所在,否则我只是会作出虚假反正而不是在这个烂摊子。 因此,没有人对如何做任何想法引发的错误之前? 下面的代码:

          from ListNode import *
          from Stack import Stack
          ch = 0
          s = 0
          check = True

        def parbalance():
              stack = Stack()
              user = input("Enter a file name: ")
              file = open(user)
              lines = file.readlines()
              for char in lines:
                 for ch in char:
                     #print(ch)
                 if ch in "([{":
                      stack.push(ch)
                 if ch in ")]}":
                    popStack = stack.pop()
                    if ch == "(" and popStack != ")":
                        check = False
                    elif ch == "[" and popStack != "]":
                        check = False
                    elif ch == "{" and popStack != "}":
                        check = False

                if stack.is_empty():
                      check = True
                       print("true")
                else:
                     check = False
                     print("false")




 parbalance()

如果有帮助,这里是她的Stack类:

   from ListNode import *

   class Stack:
         def __init__(self):
           self.top = None

        def push(self, item):
           temp = ListNode(item)
           temp.set_link(self.top)
           self.top = temp
           #self.top = ListNode(item, self.top)

        def pop(self):
            if self.top == None:
                   raise Exception("Trying to pop from an empty stack")
             temp = self.top
             self.top = temp.get_link()
             return temp.get_item()

        def destroy(self):
            self.top = None

       def is_full(self):
            return False

       def is_empty(self):
            return self.top == None

Answer 1:

使用try捕捉到的错误:

try:
    popStack = stack.pop()
except:
    # Stack is empty, set failure and bail from the function.
    check = False
    return

另外请注意,您的测试是倒退:

if ch == "(" and popStack != ")":

ch是右括号和popStack是开口的支架,所以这应该是:

if ch == ")" and popStack != "(":

没有这个变化,你的代码将识别字符串"(}"的平衡。

作为一个侧面说明,考虑返回TrueFalse的函数,而不是设置一个全局变量。 使用全局变量的函数返回值是不是一个好主意。



Answer 2:

你可以把代码放到一个try except块。 一旦你捕获异常你知道堆栈溢。 因此,必须有一种不平衡paranthesis。

顺便说一句:我不会用冗长if else链。 相反,我会大意如下的工作吧:

pars = {'(':')', '[':']', '{':'}'}
....
try:
    ...
    if ch in pars.keys(): 
        stack.push(ch)

    if ch in pars.values():
        if ch != pars[stack.pop()]:
            return False;
except:
    return False;    

return stack.is_empty()

这样,如果需要,你可以轻松地添加其他支架符号。



文章来源: Trying to stop an error with Stacks in python