質問: 1 ``` になります。 上記の分で間違っている箇所はございますでしょうか?
回答: > > `stack.push(brackets)`ならわかるのですが > > `stack.push(brackets[bracketPosition+1])`の > > `[bracketPosition+1]`はどういう意味になりますでしょうか? > > > `bracketPosition` は`brackets.indexOf(bracket)`なので,マッチした文字が`brackets`の何文字目かが入っています. 前回の質問でも回答されている通り偶数であれば開カッコであるといえます.例えば,`str[i]`(`str`のi+1文字目)が'['であればこれは`2`です. このとき,`brackets[bracketPosition]`は当然ながら`[`です.そして,`brackets[bracketPosition+1]`は`brackets`の次の文字......つまり対応する閉じカッコとなるので`]`です.これをスタックの最後に置いておきます. `else if (stack.pop() !== bracket)`は,`bracketPosition`が奇数のとき,つまり`bracket`が閉じカッコであるときに呼び出されるコードです.スタックの最後から取り出し(popすると当然取り出した値はスタックから消えます),それを期待する閉じカッコ`bracket`と比較します. もし,期待する閉じカッコではない閉じ括弧であれば期待する条件を満たさないことが確定するので`false`を返して終わるわけです. 最後の文字までループを回すと,条件をみたしていればスタックは空になっていることが期待されます.スタックにデータが残っていれば(`stack.length`が`0`でないならば),まだ閉じられていない括弧があるということになるので. ``` ex: (p: push / o: pop) aaaa(bbb[cc]dd)aaa ....p...p..o..o... => stack = [] aaa(bbb(cc[ddd]ee ...p...p..p...o.. => stack = [')',')'] ``` なので,スタックの中身が空かどうかが判断条件になるわけです. ところで,質問文にコードをどこかから転載する場合は出典の明記に努めてください.ソースコードにも著作権はあり,ときに厄介になるので. のコードがほぼ一致しますが.(質問文のコードは謎の追記によるエラー箇所が見受けられますが......) あと > > また、関数は引数strの文字列にカッコが閉じられているかどうか調べる関数なのですが > > > というのも少し違和感を覚える表現で,「文字列中の括弧の対応が正しいかを調べる表現」のほうがしっくりきます...... ### 追記について > > 書き換えるとこうです。 > > > > ``` > ()[]{}.indexOf(a(aabbb)ccc) > > ``` > > この時点で認識に誤りがあります。(というか文字列はちゃんとクォーテーションで囲ってくださいね、擬似コードとしても意味が変わってしまいます) `bracket`は`bracket = str[i]`です。これはループ内であり、`str`の`i`文字目です。 `str`が`'a(aabbb)ccc'`であれば各ループにおいて `'a', '(', 'a', 'a', 'b', 'b', 'b', ')', 'c', 'c', 'c'`が順番に入ってきます。ですので、 ``` '()[]{}'.indexOf('(') ``` のようになります。そして、indexOfの返す*n文字目*は**0始まりです**。 なので、'('のindexは`1`ではなく`0`です。 如何でしょうか?