====== スタックの応用 ====== スタックを使って、逆ポーランド記法で書かれた数式の計算法を紹介しました。\\ 今度は、括弧の整合性判定をしてみます。\\ \\ == 括弧の整合性判定 == 括弧の整合性とは、括弧の開き括弧(左側)と閉じ括弧(右側)の数があっているかどうかの判定です。\\ 例えば\\ **[({()()})]**\\ は整合性があり、\\ **[({())})]**\\ は不整合である。 括弧の対応がとれているかどうかは、記号列を左から右へと読んでいったときに、直前の開き括弧 ( { [ どれかがが今注目している同じ種類の閉じ括弧 ] } ) に対応しているかを調べればよい。 ==== アルゴリズム ==== アルゴリズム:括弧の整合性判定 - 文字列のスタックSを宣言する - 文字列表現を探索する - もし現在の文字が開始タグであればスタックにプッシュ - もし現在の文字が閉じタグであればスタックからポップを実行し、ポップされた文字が開始タグと一致した場合整合性がとれている、そうでない場合は不整合 - 全ての探索が終わった後、もしスタックに開始タグが残っていればそれも不整合である ==== 例題 ==== んー。みづらい。。。 == 整合性ありの場合 == [({()()})] ^ Push('[') | '[' | - | - | - | - | - | - | - | - | - | - | - | ({()()})] ^ Push('(') | '(' | '[' | - | - | - | - | - | - | - | - | - | - | {()()})] ^ Push('{') | '{' | '(' | '[' | - | - | - | - | - | - | - | - | - | ()()})] ^ Push('(') | '(' | '{' | '(' | '[' | - | - | - | - | - | - | - | - | ) ()})] ^ Pop() '(' ← | '{' | '(' | '[' | - | - | - | - | - | - | - | - | - | '(' ’)' :整合性OK ()})] ^ Push('(') | '(' | '{' | '(' | '[' | - | - | - | - | - | - | - | - | ) })] ^ Pop() '(' ← | '{' | '(' | '[' | - | - | - | - | - | - | - | - | - | '(' ')' :整合性OK } )] ^ Pop() '{' ← | '(' | '[' | - | - | - | - | - | - | - | - | - | - | '{' '}' :整合性OK ) ] ^ Pop() '(' ← | '[' | - | - | - | - | - | - | - | - | - | - | - | '(' ')' :整合性OK ] ^ Pop() '[' ←  | - | - | - | - | - | - | - | - | - | - | - | - | '[' ']' :整合性OK 文字列全て走査完了 | - | - | - | - | - | - | - | - | - | - | - | - | 空のスタック == 不整合な場合 == その1.開きかっこが足らん? ({)}) | - | - | - | - | - | - | - | - | - | - | - | - | 空のスタックを用意 ({)}) ^ Push('(') | '(' | - | - | - | - | - | - | - | - | - | - | - | {)}) ^ Push('{') | '{' | '(' | - | - | - | - | - | - | - | - | - | - | ) }) ^ Pop() '{' ← | '(' | - | - | - | - | - | - | - | - | - | - | - | '{' ')' :不整合(´;ω;`) その2.閉じかっこが足らん? ({) | - | - | - | - | - | - | - | - | - | - | - | - | 空のスタックを用意 ({) ^ Push('(') | '(' | - | - | - | - | - | - | - | - | - | - | - | {) ^ Push('{') | '{' | '(' | - | - | - | - | - | - | - | - | - | - | ) ^ Pop() '{' ← | '(' | - | - | - | - | - | - | - | - | - | - | - | '{' ')' :不整合(´;ω;`)ウゥゥ