[Baekjun|Python]9012:かっこ

3771 ワード

💡 基本的なスタックの問題!近づきにくい
質問する
括弧文字列(Parentosis String,PS)は、2つの括弧記号「(」と「)」からなる文字列である.ここで、括弧形状が正しい文字列を正しい括弧文字列(Valid PS,VPS)と呼ぶ.括弧の「()」文字列をデフォルトVPSと呼びます.xがVPSであれば、括弧に入れる新しい文字列「(x)」もVPSとなります.また,2つのVPSxとyを接続した新しい文字列xyもVPSとなる.例えば、「()()()」「((())」はVPSであるが、「()(」()、「()()())」と「(((()」はVPSではなく文字列である.
入力した括弧文字列がVPSであるかどうかを判断し、結果をYESとNOとして表す必要があります.
入力
入力データは標準入力を採用している.T個のテストデータとして入力します.入力された最初の行は、入力データの数を表す整数Tを与える.各テストデータの最初の行にはカッコ文字列があります.カッコ文字列の長さは2または50以下です.
しゅつりょく
出力は標準出力を採用する.カッコ文字列が正しいカッコ文字列(VPS)である場合は、「YES」または「NO」を行単位で出力します.
解答方法
基本整理のルールは以下の通りです.
  • 複数の括弧がスタックに入り、
  • と入力してかっこを閉じる場合は、次の条件で行います.
  • スタックに何もない場合はNOを返します.
  • スタックが空でない場合、最後の要素()がポップアップされます.
  • 最終スタックの長さを確認し、残りがなければ「YES」、残りがあれば「NO」を出力します.
  • def vps(x):
        stack = []
        for i in x:
            if i == "(":
                stack.append(i)
            elif i == ")":
                if len(stack) == 0:
                    return "NO"
                stack.pop()
        if len(stack) == 0:
            return "YES"
        return "NO"
    
    t = int(input())
    for _ in range(t):
        ps = list(input())
        print(vps(ps))