JavaScriptで数式から括弧を削除する方法を解説
問題
数式を表す文字列 str を第一引数(唯一の引数)として受け取る JavaScript 関数を作成する必要があります。
この関数の目的は、演算子とオペランド(項)の意味や順序を変えずに、数式から括弧をすべて取り除くことです。
例えば、関数への入力が以下の場合を考えてみましょう。
入力:
const str = 'u-(v-w-(x+y))-z';
出力:
const output = 'u-v+w+x+y-z';
アプローチのポイント
括弧を取り除く際に最も重要なのは、括弧の直前の符号によって、括弧内の各項の符号がどのように変化するかを正しく追跡することです。
本解説ではスタック(stack)を使い、これまでに出てきた符号の履歴を管理しながら処理を進めます。
- 文字が「(」または「)」の場合:スタックの末尾を参照し、その時点で有効な符号を lastSign として更新します。
- 文字が「+」の場合:スタックの末尾がまだ符号(+ または −)でなければ、lastSign をスタックに積みます。
- 文字が「−」の場合:lastSign が「−」なら符号が打ち消されて「+」となり、そうでなければ「−」となります。スタックの末尾と重複する場合は pop() してから新しい符号を push します。
- それ以外(英字などの項)の場合:そのままスタックへ push します。
最後に、スタックの内容を連結した文字列の先頭に余分な「+」が残っていれば削除して返します。
コード例
以下が実際の実装コードです。
const str = 'u-(v-w-(x+y))-z';
const removeParentheses = (str = '') => {
const stack = [];
let lastSign = '+';
for (let char of str) {
if (char === '(' || char === ')') {
lastSign = stack[stack.length - 1] || '+';
} else if (char === '+') {
if (stack[stack.length - 1] !== '-' && stack[stack.length - 1] !== '+') {
stack.push(lastSign);
}
} else if (char === '-') {
if (lastSign === '-') {
if (stack[stack.length - 1] === '-') stack.pop();
stack.push('+');
} else {
if (stack[stack.length - 1] === '+') stack.pop();
stack.push('-');
}
} else {
stack.push(char);
}
}
return stack.join('').replace(/^\+/, '');
};
console.log(removeParentheses(str));
出力結果
u-v+w+x+y-z
-
JavaScriptで双方向連結リストの要素を削除する方法
双方向連結リストから要素を削除する仕組み連結リストからの要素削除は非常にシンプルです。やるべきことは「削除したいノードへの参照を失わせる」こと、つまり対象ノードをリンクのチェーンから切り離すだけです。ただし、削除する位置によって処理が異なるため、次の3つのケースを考慮する必要があります。先頭(head)の要素を削除する: head = head.next と代入するだけで、先頭ノードへの参照は失われ、headは2番目の要素を指すようになります。このとき、新しいheadのprevをnullに設定し、前方向のリンクも忘れずに切っておきます。末尾(tail)の要素を削除する: 後ろから2番目のノード
-
【JavaScript】外部関数の内側からイベントリスナーを削除する方法
JavaScriptで、外部関数の内側からイベントリスナーを削除したい場合は、removeEventListener()メソッドを使用します。 リスナーを削除する際のポイント removeEventListener()でリスナーを正しく削除するには、addEventListener()で登録したときと同じ関数への参照を渡す必要があります。そのため、無名関数(匿名関数)をそのまま登録してしまうと、後から削除できなくなる点に注意しましょう。本記事のサンプルコードでは、登録時に名前付き関数funを渡し、それをそのまま外部関数へ引き渡すことで、内側からの削除を実現しています。 コード例 以下が実際