스택(Stack) 구현하기 in Go
스택은 후입 선출 (LIFO) 원리를 따라 정렬된 데이터 구조입니다.
golang에서 Slice
를 사용하면 쉽게 스택을 구현할 수 있습니다.
- built-in 함수인
append
를 사용하여push
를 구현합니다. - 배열의 마지막 요소를 잘라내는 방식으로
pop
을 구현합니다.
구현
Go 언어로 구현하면 다음과 같습니다.
package main
import "fmt"
type Stack []interface{}
//IsEmpty - 스택이 비어있는지 확인하는 함수
func (s *Stack) IsEmpty() bool {
return len(*s) == 0
}
//Push - 스택에 값을 추가하는 함수.
func (s *Stack) Push(data interface{}) {
*s = append(*s, data) // 스택 끝(top)에 값을 추가함.
fmt.Printf("%d pushed to stack\n", data)
}
//Pop - 스택에 값을 제거하고 top위치에 값을 반환하는 함수.
func (s *Stack) Pop() interface{} {
if s.IsEmpty() {
fmt.Println("stack is empty")
return nil
} else {
top := len(*s) - 1
data := (*s)[top] // top 위치에 있는 값을 가져 옴
*s = (*s)[:top] // 스택에 마지막 데이터 제거함
return data
}
}
func main() {
var s Stack
s.Push(1)
s.Push(2)
s.Push(3)
fmt.Printf("%d poped from stack\n", s.Pop())
}
Output:
1 pushed to stack
2 pushed to stack
3 pushed to stack
3 poped from stack
소스는 아래 깃허브에서 받을 수 있습니다.
https://github.com/dev-yyh/Go/tree/main/DS/stack
설명
- 모든 유형을 저장할 수 있게 빈 인터페이스(interface{}) 유형으로 스택을 초기화합니다.
- push 함수는 append 함수를 사용하여 배열 마지막 부분에 값을 추가해 줍니다.
- pop함수는 스택이 비어있는지 확인하고 비어있지 않다면 top 위치에 있는 값을 가져온 뒤 삭제합니다.