정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
오랜만에 stack을 구현해보고자 Stack 객체를 생성해서 주어진 명령을 Stack의 프로토타입 메서드로 추가해주었다.
그냥 switch문 안에서 바로 로직을 짜도 되지만 메서드를 먼저 선언해두고 입력값에 따라서 호출만 해주는 방식으로 풀었다.
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');
function Stack() {
this._stack = [];
this.length = 0;
}
Stack.prototype.push = function(value) {
this._stack[this.length++] = value;
}
Stack.prototype.pop = function() {
if (!this.length) return -1;
const value = this.top();
this._stack.splice(this.length-- - 1, 1);
return value;
}
Stack.prototype.top = function() {
if (!this.length) return -1;
return this._stack.slice(-1);
}
Stack.prototype.size = function() {
return this.length;
}
Stack.prototype.empty = function() {
return !this.length ? 1 : 0;
}
let result = '';
const stack = new Stack();
const commands = input.splice(1,);
for (c of commands) {
switch (c.split(' ')[0]) {
case 'push':
stack.push(c.split(' ')[1]);
break;
case 'pop':
result += (stack.pop() + '\n');
break;
case 'top':
result += (stack.top() + '\n');
break;
case 'size':
result += (stack.size() + '\n');
break;
case 'empty':
result += (stack.empty() + '\n');
break;
}
}
console.log(result);