package main
import "log"
type Node struct {
Data int
Next *Node
}
type Stack struct {
Top *Node
}
func InitStack() *Stack {
stack := Stack{Top: nil}
return &stack
}
func (s *Stack) PushStack(data int) {
new_node := Node{Data: data, Next: s.Top}
s.Top = &new_node
log.Println("Push", s.Top.Data)
}
func (s *Stack) PopStack() {
if s.Top == nil {
return
}
data := s.Top.Data // 스택이 마지막으로 Top한 Node Data
temp := s.Top // 스택이 마지막으로 Top한 Node
s.Top = s.Top.Next // 스택이 마지막으로 Top한 Node의 Next Node
temp.Data = 0
temp = nil // Free와 같은 것인데 nil로 초기화
log.Println("Pop", data)
}
func (s *Stack) Empty() bool {
if s.Top == nil {
return true
}
return false
}
func main() {
stack := InitStack()
stack.PushStack(5)
stack.PopStack()
stack.PushStack(2)
stack.PushStack(1)
stack.PopStack()
log.Println(stack.Empty())
stack.PopStack()
stack.PopStack()
stack.PopStack()
stack.PopStack()
stack.PopStack()
stack.PopStack()
log.Println(stack.Empty())
return
}

하지만 연결 리스트를 사용한다면… 어디서든 노드에서 값을 추가하고 제거할 수 있는 것으로 알고 있습니다.
스택을 사용한다면 중간에 데이터를 넣을 수 있는지 여부와는 관계가 없는 것 같습니다.