白駿10828スタック


資料構造に基づいて,白峻に位置するスタック問題を解いた.
資料構造を学習する際に作成されるコードに比べて,確かにより多くの防御コードが必要である.
質問:https://www.acmicpc.net/problem/10828

問題に関しては制限事項を親切に説明してくれるので、そのまま実施すれば良いのです.パフォーマンスを最大限に向上させるために、リンクリストでスタックを実装してみました.
const fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const n = input.splice(0, 1);

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class Stack {
  constructor() {
    this.top = null;
    this.size = 0;
  }

  push(value) {
    const newNode = new Node(value);
    if (this.top === null) {
      this.top = newNode;
      this.top.next = newNode;
      this.size += 1;
    } else {
      newNode.next = this.top;
      this.top = newNode;
      this.size += 1;
    }
  }

  pop() {
    if (this.size === 0) {
      return -1;
    } else {
      const value = this.top.value;
      this.top = this.top.next;
      this.size -= 1;
      return value;
    }
  }

  getSize() {
    return this.size;
  }

  empty() {
    if (this.size === 0) return 1;
    else return 0;
  }

  getTop() {
    if (this.size === 0) {
      return -1;
    } else return this.top.value;
  }
}

const myStack = new Stack();
for (let i = 0; i < input.length; i++) {
  if (input[i] === 'top') {
    console.log(myStack.getTop());
  } else if (input[i] === 'size') {
    console.log(myStack.getSize());
  } else if (input[i] === 'empty') {
    console.log(myStack.empty());
  } else if (input[i] === 'pop') {
    console.log(myStack.pop());
  } else {
    const [command, value] = input[i].split(' ');
    myStack.push(Number(value));
  }
}
Node.jsの特性のため、入力したコードは長くなるしかありません...ちょっと直してください.
でも結果はタイムアウト!
なぜか長い間考えていた.どう考えても、出力効果がよく、Edge caseもなく、性能のためリンクリストにしてもダメなようです?ただJavaScriptは臭いですか?ジャスロは柏俊を解くことができないのか.そう思うよ😥
問題はconsole.logです.
コンソールで言えば、彼はもともとデバッグ関数なので、速度が遅いです.詳細はスタックオーバーフローリンクで参考にしてください!
https://stackoverflow.com/questions/2934509/exclude-debug-javascript-code-during-minification
だから最後にanswerという空の文字列にすべての答えが含まれていて、最後に一度しか出力されず、結果的に正解が処理されました.
const fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const n = input.splice(0, 1);

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class Stack {
  constructor() {
    this.top = null;
    this.size = 0;
  }

  push(value) {
    const newNode = new Node(value);
    if (this.top === null) {
      this.top = newNode;
      this.top.next = newNode;
      this.size += 1;
    } else {
      newNode.next = this.top;
      this.top = newNode;
      this.size += 1;
    }
  }

  pop() {
    if (this.size === 0) {
      return -1;
    } else {
      const value = this.top.value;
      this.top = this.top.next;
      this.size -= 1;
      return value;
    }
  }

  getSize() {
    return this.size;
  }

  empty() {
    if (this.size === 0) return 1;
    else return 0;
  }

  getTop() {
    if (this.size === 0) {
      return -1;
    } else return this.top.value;
  }
}

const myStack = new Stack();
let answer = '';
for (let i = 0; i < input.length; i++) {
  if (input[i] === 'top') {
    answer += myStack.getTop() + '\n';
  } else if (input[i] === 'size') {
    answer += myStack.getSize() + '\n';
  } else if (input[i] === 'empty') {
    answer += myStack.empty() + '\n';
  } else if (input[i] === 'pop') {
    answer += myStack.pop() + '\n';
  } else {
    const [command, value] = input[i].split(' ');
    myStack.push(Number(value));
  }
}
console.log(answer);