[자료구조 문제정리] - 01. stack 구현

김형주·2021년 4월 25일
1

01.Stack 구현

빈칸을 채워넣어 Stack을 구현하는 방식의 문제다. 문제를 풀어서, 코드옆이나 아래에 주석으로 답을 달고 당시의 내 생각과 접근방식을 적어놓으려고 한다. 기록은 언제나 힘이 되고 내 지식으로 들어오게 된다. 놓치지말자. 이미 이것외에도 놓친 것들이 너무 많다.

class Stack {
  constructor() {
    this.storage = {};
    this.top = 0; // 스택의 가장 상단을 가리키는 포인터 변수를 초기화 합니다.
    // stack은 LIFO(마지막에 들어온게 먼저 나간다.)방식을 채용하고 있으므로, 
    // 최상단을 가리킬 포인터 변수가 항상 필요하다. 
  }

기본적으로 Stack은 자료를 보관할 storage(array || object)를 가지고, 최상단 데이터를 가리키는 포인터 변수가 존재한다. 추가적으로 lengthsizemethod가 아닌 property로 가지고 있을수도 있다. pushpop같은 데이터 할당 해제를 위한 method 외에도, searchviewing 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을 보낼 수가 없다.

중요사항

  • size 그리고 top pointer variable는 바로 생각해내야 된다.
  • 스택은 LIFO라는 사실을 절대로 까먹으면 안된다.
  • top pointer는 제일 위 데이터에 매겨지는 값이기 때문에, push할때 붙고, 늘어난다.(다음값을 위해)
  • 가능하면 변하면 안되는 것들은 const로 선언하자.
profile
만물에 관심이 많은 잡학지식사전이자, 새로운 도전을 꿈꾸는 주니어 개발자 / 잡학지식에서 벗어나서 전문성을 가진 엔지니어로 거듭나자!

0개의 댓글