1

テキストが括弧に関してバランスが取れていることを確認するプログラムを作成しようとしています(()、[]、{}ではなく()、[、{})。バランスが取れている場合と、閉じ括弧が欠落している場合(前の例のように)バランスが取れていない場合に機能させることができます。私ができないのは、左側に括弧 (()、]、{}) がない場合、アンバランスとして戻ってくることです。空のスタックからポップしようとしていることは知っていますが、それに対抗する方法がわかりません。私の先生は、空のスタックにポップしようとすると例外が自動的に発生し、クラスを変更できないことをスタッククラスに持っています。これが問題です。そして、この混乱に陥らないでください。それで、そのエラーが発生する前にそれを行う方法のアイデアはありますか? コードは次のとおりです。

          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
4

2 に答える 2

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 != "(":

この変更を行わないと、コードは文字列をバランスの取れたものとして認識します"(}"

補足として、グローバル変数を設定する代わりに、関数からTrueorを返すことを検討してください。Falseグローバル変数を使用して関数から値を返すことはお勧めできません。

于 2013-10-16T20:59:53.740 に答える
0

try exceptコードをブロックに入れることができます。例外をキャッチすると、スタックがアンダーフローすることがわかります。したがって、アンバランスな括弧が必要です。

ちなみに、長い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()

そうすれば、必要に応じて他のブラケット記号を簡単に追加できます。

于 2013-10-16T21:01:30.103 に答える