今回は paiza の「スタック実装編 step 1」の問題に挑戦!
問題概要
■ テーマ
- スタック(Stack)
- 構造:先入れ後出し(LIFO: Last In, First Out)
■ やること
- 空の配列
Aを用意する -
Q個のクエリを順番に処理する - 各クエリ処理後に、配列
Aの中身を出力する
■ クエリの種類
-
1 X- PUSH 操作
- 配列
Aの末尾にXを追加
-
2- POP 操作
- 配列
Aの末尾の要素を削除
■ 入力形式
Q
query_1
query_2
...
query_Q
-
Q:クエリの数(1以上100未満) - 各クエリは
-
1 X(PUSH) -
2(POP)
-
※ POP が来るときは必ず要素がある(空配列にはならない)
■ 出力形式
- 各クエリ処理後の配列
Aを出力 - 半角スペース区切り
- 各行の末尾に改行
- 余計な空行や文字は出さない
入力例:
4
1 4
1 5
1 3
2
出力例:
4
4 5
4 5 3
4 5
✅OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const Q = Number(lines[0]);
const query = lines.slice(1).map(q => q.split(' ').map(Number));
const arrA = [];
for (let i = 0; i < Q; i++) {
const [num, x] = query[i];
if (num === 1) {
arrA.push(x);
} else {
arrA.pop();
}
console.log(arrA.join(' '));
}
});
🔍コードの流れ
・readlineで標準入力を受け取る準備をする
・入力された各行を line 配列に保存していく
・入力が終わったら close イベントが実行される
・1行目を数値に変換して Q(クエリ数)を取得
・2行目以降を「数値の配列」に変換して query に格納
・空の配列 arrA を用意(スタックとして使う)
・Q回ループする
・query[i] を分割代入で num と x に取り出す
・num が 1 なら
→ arrA.push(x)(末尾に追加)
・それ以外(2)なら
→ arrA.pop()(末尾を削除)
・処理後の arrA を join(' ') でスペース区切りにして出力
📝まとめ
■ スタックの理解
- LIFO(最後に入れたものが最初に出る)
- 追加・削除は「末尾」だけ
- イメージは「積み上げられた本」
■ 配列でスタックを実装できる
-
push()→ 追加 -
pop()→ 削除 -
join(' ')→ 出力整形