2017년 1월 23일 월요일

스택 입출력 (Stack input/output)

Go는 generic을 자연스럽게 지원하지는 않아서, 다양한 타입의 데이터를 저장하는 몇 가지 trick을 사용한다. 이 포스트에서 stack을 구현할 때는 C/C++의 void pointer와 유사하게 Go의 interface{} 형태로 데이터를 저장하고, 사용하는 쪽에서 적절한 형변환(assertion)을 수행하는 방식으로 스택을 구현한다.
실제 데이터는 slice에 저장하고, slice operation을 사용하여 스택의 push, pop, top, empty여부 확인 구현할 수 있다.
Stack API의 디자인은 empty시 동작을 어떻게 나타낼 것인가에 답해야 하는데, 이 포스트에서는 C++의 standard template library에서처럼 empty시 stack 연산 수행의 동작을 보장하지 않는 형태로 디자인하였다.

type Stack struct {
    S []interface{}
}

func (s *Stack) Push(item interface{}) {
    s.S = append(s.S, item)
}

func (s *Stack) Top() interface{} {
    return s.S[len(s.S) - 1]
}

func (s *Stack) IsEmpty() bool {
    return len(s.S) == 0
}

func (s *Stack) Pop() {
    s.S = s.S[:len(s.S) - 1]

}

댓글 없음:

댓글 쓰기

잔돈 만드는 방법 (Coin change)

숫자(N)와 숫자의 집합(C = {C1, C2, C3, ...}이 주어졌을 때, C의 숫자들을 중복으로 사용하여 N을 만드는 방법의 수를 구해보자.  잔돈 문제로 바꾸어서 표현하면, 각각 값어치가 C1, C2, C3, ... 인 동전이 무한대로 주어질...