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