[20]10828号スタック



10828号スタック


質問する


整数を格納するスタックを実装し、入力としてのコマンドを処理するプログラムを作成します.
命令は全部で5種類ある.
  • push X:整数Xをスタックに入れる演算.
  • pop:スタックの最上位の整数を除去し、出力します.スタックに整数がない場合は、-1が出力されます.
  • size:出力スタック内の整数の個数.
  • empty:スタックが空の場合、1または0が出力されます.
  • top:出力スタックの一番上の整数.スタックに整数がない場合は、-1が出力されます.
  • 入力


    1行目に与えられるコマンド数N(1≦N≦10000).2行目からN行目までそれぞれ1つのコマンドがあります.与えられた整数は1以上であり、100000以下である.問題にない命令はない.

    しゅつりょく


    出力するコマンドが発行されるたびに、各行に1つのコマンドが出力されます.

    コピー例入力1

    14
    push 1
    push 2
    top
    size
    empty
    pop
    pop
    pop
    size
    empty
    pop
    push 3
    empty
    top

    コピー例出力1

    2
    2
    0
    2
    1
    -1
    0
    1
    -1
    0
    3

    コピー例入力2

    7
    pop
    top
    push 123
    top
    pop
    top
    pop

    コピーサンプル出力2

    -1
    -1
    123
    123
    -1
    -1

    コード#コード#

    //---- 세팅 ----//
    const fs = require('fs');
    const stdin = (
      process.platform === 'linux'
        ? fs.readFileSync('/dev/stdin').toString()
        : `\
    7
    pop
    top
    push 123
    top
    pop
    top
    pop
    `
    ).split('\n');
    
    const input = (() => {
      let line = 0;
      return () => stdin[line++];
    })();
    
    //---- 풀이 -----//
    
    const t = Number(input());
    const operationArr = [];
    
    const stack = {
      value: [],
      push: n => {
        stack.value.push(n);
      },
      pop: () => {
        const val = stack.value.pop();
        return val ? val : -1;
      },
      size: () => {
        return stack.value.length;
      },
      empty: () => {
        return stack.value.length === 0 ? 1 : 0;
      },
      top: () => {
        return stack.value.length === 0 ? -1 : stack.value[stack.value.length - 1];
      },
    };
    
    [...Array(t)].forEach(() => {
      operationArr.push(input().split(' '));
    });
    
    const resArr = [];
    
    operationArr.forEach(operation => {
      operation[0] === 'push'
        ? stack[operation[0]](operation[1])
        : resArr.push(stack[operation[0]]());
    });
    
    console.log(resArr.join('\n'));
    

    に答える

    operationArrという名前の配列に入力されたコマンドが含まれています.push命令であれば、パラメータを受け入れるので、0番目のインデックスにはpushが含まれ、1番目のインデックスには인자が含まれます.stackオブジェクトを生成します.stackオブジェクトには、各命令を処理する関数を定義する値配列valuesがある.operationArr配列を回転させると、0番目のインデックスにpushがある場合は、パラメータを一緒に残し、それ以外のコマンド関数を実行します.