빈칸을 채워넣어 Stack을 구현하는 방식의 문제다. 문제를 풀어서, 코드옆이나 아래에 주석으로 답을 달고 당시의 내 생각과 접근방식을 적어놓으려고 한다. 기록은 언제나 힘이 되고 내 지식으로 들어오게 된다. 놓치지말자. 이미 이것외에도 놓친 것들이 너무 많다.
class Stack { constructor() { this.storage = {}; this.top = 0; // 스택의 가장 상단을 가리키는 포인터 변수를 초기화 합니다. // stack은 LIFO(마지막에 들어온게 먼저 나간다.)방식을 채용하고 있으므로, // 최상단을 가리킬 포인터 변수가 항상 필요하다. }
기본적으로 Stack
은 자료를 보관할 storage
(array || object)를 가지고, 최상단 데이터를 가리키는 포인터 변수가 존재한다. 추가적으로 length
나 size
를 method가 아닌 property
로 가지고 있을수도 있다. push
나 pop
같은 데이터 할당 해제를 위한 method 외에도, search
나 viewing
method가 필요할 수도 있다. 현재 상태를 조회하거나, target을 조회하기위한 목적으로 필요할 수도 있기 때문이다.
size() { return FILL_ME_IN;//this.top // size 메소드는 stack의 현재 사이즈를 리턴한다. // 사이즈는 결국 최상단 포인터의 값이 된다. }
여기에서는 size()가 리턴하는 method
로 존재하는데, property
에 메소드를 넣어놓고 접근하는 방식으로 사용할 수도 있다.
// 스택에 데이터를 추가 할 수 있어야 합니다. push(this, element) { this.storage[FILL_ME_IN] = element; this.top += 1; }
this.size()로 size값을 받아서 key로 받아 데이터를 push한다. size는 전체 갯수를 의미하는데 여기서 1을 빼야 현재 들어있는 최신값을 받아올 수 있다. 그렇기 때문에 새 값은 size값 그대로 집어넣는다.
// 가장 나중에 추가된 데이터가 가장 먼저 추출되어야 합니다. pop() { // 빈 스택에 pop 연산을 적용해도 에러가 발생하지 않아야 합니다 if (FILL_ME_IN) { //this.size() === 0 일때의 연산오류가 나면 안됨 return; //생 return을 갖다놔서 아무것도 돌려주지않고 아무것도 안일어남 } const result = this.storage[FILL_ME_IN]; //가장 먼저 들어온 데이터를 내보내야하므로, //this.top-1 이 된다. return 해줘야되기 때문에 delete 하기전에 변수(result)에 담는다. delete this.storage[FILL_ME_IN];//위랑 동일하게 this.top -= 1; return result; } }
여기서 중요한 것은 result에 미리 값을 받아놓고 삭제해야된다는 점이다. 왜냐하면, delete를 해버리면 키-값 쌍이 사라져버리기 때문에 result로 return을 보낼 수가 없다.
const
로 선언하자.