저번에 이어서 이번에는 queue 구현 코드이다.
class Queue{
private var backStack = Stack<Any>()
private var frontStack = Stack<Any>()
var isEmpty : Bool{
return backStack.isEmpty && frontStack.isEmpty
}
var front : Any?{
guard backStack.isEmpty || frontStack.isEmpty else {return nil}
if !frontStack.isEmpty {return frontStack.top}
while !backStack.isEmpty {
if let top = backStack.pop() {
frontStack.push(top)
}
}
return frontStack.isEmpty ? nil : frontStack.top
}
func push(_ element : Any){
backStack.push(element)
}
func pop() -> Any?{
if frontStack.isEmpty{
while !backStack.isEmpty {
if let top = backStack.pop(){
frontStack.push(top)
}
}
}
return frontStack.isEmpty ? nil : frontStack.pop()
}
}
queue를 어떻게 구현해줄까 하다가.. 단순하게 stack 자료구조를 두 개 이용하는 방식으로 구현을 했다.
더 좋은 방법이 있을까... 모르겠다
--- 1월 22일 월요일 새벽 1시 37분 수정 --
문제를 풀던 도중 더 좋은 코드가 있는 것 같아서 살짝만 보고 스스로 구현해보았다.
이론은 class는 자신을 다른 변수에게 주었을 때 복사가 되는 것이 아니라 주소값은 주는 것이기에 유일하다에서 시작되었다.
node를 클래스로 만들어준 뒤에 queue도 클래스로 만들어 주어서 구현하는 방식으로 진행하였다. 이 방식이 좀 깔끔한 것 같다.
class Node<T>{
var prevNode : Node<T>?
var nextNode : Node<T>?
var value : T?
}
class Queue<T>{
var front : Node<T>?
var back : Node<T>?
var count : Int
init() {
count = 0
}
var isEmpty : Bool {
return count == 0 ? true : false
}
func push(_ newNode : Node<T>){
if let node = back{//원래 back이 있던 자리에 newNode가 들어가고
node.nextNode = newNode//다음 노드 확인
back = newNode//현재 자신이 마지막으로 확인
newNode.prevNode = node//이전 노드 확인
}else{//아니면
front = newNode
back = newNode
}
count+=1
}
func pop() -> Node<T>?{
guard count != 0 else {return nil}
let ret = front
front = front?.nextNode
count-=1
return ret
}
}
많이 깔끔한 듯 좋다 좋아~ 이런 식으로 많이 구현할 듯요..
스위프트가 약간 c언어와 비슷한 느낌이 많이 들기에 정이 가는 듯 싶다.
'자료구조 > by swift' 카테고리의 다른 글
swift PriorityQueue 구현 (1) | 2024.01.31 |
---|---|
swift Double-LinkedList 구현 (1) | 2024.01.30 |
swift stack 구현 (0) | 2024.01.18 |