JavaScriptでスタックのプッシュ・ポップ操作シーケンスを検証する方法
問題
2つの配列 pushed と popped を第1引数と第2引数として受け取るJavaScript関数を作成します。どちらの配列にも、重複しない一意な要素のみが含まれることが保証されています。
この関数は、最初に空のスタックに対して一連のpush(プッシュ)とpop(ポップ)操作を実行した結果として、この2つの配列が実現可能である場合に限り true を返し、そうでなければ false を返す必要があります。
例えば、関数への入力が以下の場合を考えてみましょう。
const pushed = [1, 2, 3, 4, 5]; const popped = [4, 5, 3, 2, 1];
このとき、期待される出力は次のとおりです。
const output = true;
出力の解説
この出力が true になるのは、以下のような操作シーケンスが存在するからです。
push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
つまり、pushed の要素を順番にスタックへ積みながら、適切なタイミングでpopすることで、popped の順序通りに要素を取り出せるためです。
アプローチ
この問題は、シミュレーションによって効率的に解くことができます。
pushedの要素を先頭から順にスタックへプッシュしていきます。- 各ステップで、スタックの先頭(トップ)にある要素が
poppedの現在の要素と一致していれば、その都度ポップします。 - すべてのプッシュが完了した後もスタックに残っている要素は、
poppedの残りの要素と順番に一致するかどうかを確認します。1つでも不一致があれば、そのシーケンスは無効です。
時間計算量はO(n)、空間計算量もO(n)であり、非常に効率的です。
コード例
上記のアプローチを実装すると、コードは次のようになります。
const pushed = [1, 2, 3, 4, 5];
const popped = [4, 5, 3, 2, 1];
const validateSequence = (pushed = [], popped = []) => {
let pushedIndex = 0;
let poppedIndex = 0;
const stack = [];
// pushed の要素を順にスタックへプッシュし、
// スタックのトップが popped の現在の要素と一致すればポップ
while (pushedIndex < pushed.length) {
if (stack[stack.length - 1] !== popped[poppedIndex]) {
stack.push(pushed[pushedIndex++]);
} else {
stack.pop();
poppedIndex += 1;
}
}
// 残ったスタックの中身が popped の順序と一致するか確認
while (stack.length) {
if (stack.pop() !== popped[poppedIndex++]) {
return false;
}
}
return true;
};
console.log(validateSequence(pushed, popped));出力
コンソールに出力される結果は以下のとおりです。
true
このように、スタックを使ったシミュレーションを行うことで、与えられたプッシュ・ポップのシーケンスが実際に実現可能なものかどうかを簡単に検証できます。
-
JavaScriptで使えるポップアップダイアログの3種類を解説!alert・confirm・promptの違いと使い方
JavaScriptには、ブラウザ上で手軽にユーザーと対話できる組み込みのポップアップダイアログが3種類用意されています。それぞれ「alert」「confirm」「prompt」というメソッドで、用途に応じて使い分けることができます。 1. alert() — 警告ダイアログ window.alert() メソッドは、指定したメッセージと「OK」ボタンだけを持つシンプルな警告ダイアログを表示します。ユーザーへの通知や注意喚起など、返答を必要としない一方向のメッセージ表示に適しています。 使用例 <script> alert(これは
-
JavaScriptでアップロード時のファイルサイズを検証する方法
Webアプリケーションを開発していると、「ユーザーが大きすぎるファイルをアップロードできないようにしたい」という要件によく出会います。サーバー側でのチェックも重要ですが、JavaScriptを使えばブラウザ上(クライアント側)で即座にファイルサイズを検証でき、無駄な通信やサーバーへの負荷を軽減することができます。 ポイントは、ファイル入力要素(<input type=file>)の files プロパティです。ここには選択されたファイルの情報が File オブジェクトとして格納されており、size プロパティ(バイト単位)を参照することで、アップロード前の段階でファイルサイズを取得