자료구조발행일 2023. 5. 28.원본 https://blog.naver.com/jword_/223111454069 ↗

파이썬 연결리스트 큐 구현하기 (자료구조변환)

파이썬 연결리스트 큐 구현하기 (자료구조변환) — #파이썬연결리스트 #연결리스트큐 #연결리스트 #큐 #자료구조 #자료구조변환 AI스쿨 msa기반 java 백엔드...

#자료구조#Naver Blog

#파이썬연결리스트 #연결리스트큐 #연결리스트 #큐 #자료구조 #자료구조변환

​

AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다

자료구조 변환

이전글을 통해 파이썬으로 배열, 링크드리스트, 스택, 큐 등의 자료구조를 구현해보았습니다. 이번에는 구현된 자료구조를 이용하여 다른 자료구조로 변환하는 작업을 해볼까 합니다.

​

예를들어 스택을 구현한다고 가정하면, 배열을 사용하여 스택을 구현하거나 큐로 스택을 구현하는 등의 방법입니다.

​

스택, 큐, 배열, 링크드리스트 순으로 글이 올라올 예정이며, 다른 자료구조로 각각의 자료구조를 어떻게 구현할 수 있는지 정리할겁니다.

연결리스트로 큐 구현하기

ListQueue

이미지

이번에는 연결리스트를 이용하여 큐를 구현합니다. 리스트와 큐의 기능은 이전글을 참고해주세요.

사용할 연결리스트

LinkedList()

이전글을 통해 구현한 연결리스트입니다. 연결리스트의 기능을 생각하시면서 코드를 봐주새요.

ListQueue() 선언하기

\_\_init\_\_

class ListQueue: def \_\_init\_\_(self): self.list = LinkedList()​ def push(self, value): pass​ def pop(self): pass

ListQueue역시 Queue의 형태기 때문에 똑같은 뼈대를 가지고 있습니다. ListQueue의 경우는 우선적으로 LinkedList를 선언해줘야합니다.

ListQueue.push()

push

ListQueue를 만들기 위해 사용한 LinkedList의 경우 빈값에서 add될 경우 아래와 같은 방법으로 노드가 연결됩니다.

​

  1. 초기상태

None

​

  1. add(value)

new\_node(current) -> None

​

  1. add2(value2)

new\_node2(current) -> new\_node -> None

​

이런 방법으로 노드가 연결되어 가장 처음에 넣은 값이 끝 위치에 놓이게 됩니다.

class ListQueue: def \_\_init\_\_(self): self.list = LinkedList() self.count = 0​ def push(self, value): self.list.add(value) self.list.move\_front()​ self.list.add(value) self.count += 1 for i in range(self.count - 1): self.list.move\_next()​ def pop(self): pass

저는 ListQueue의 psuh()가 끝난상태에서 현재위치를 항상 끝에 위치하게끔 구현하고자 하였습니다. 만약 ListQueue의 새로운 push()가 발생한다면, 항상 처음값(self.head)로 current를 옮기고 push()하도록 구현합니다.

​

또한 노드의 갯수를 세는 self.count변수를 만들고 맨 마지막 노드로 현재위치를 옮겨줍니다.

​

예상 실행은 이렇습니다.

​

  1. None

2.new\_node1(c) -> None

3.new\_node2 -> new\_node1(c) -> None

push()

4.1. new\_node2(c) -> new\_node1 -> None

4.2. new\_node3(c) -> new\_node2 -> new\_node1 -> None

4.3. new\_node3 -> new\_node2 -> new\_node1(c) -> None

​

이런방법으로 현재위치를 항상 맨 마지막에 두면 pop()을 간단하게 구현할 수 있습니다.

ListQueue.pop()

pop()

위의 4.3. new\_node3 -> new\_node2 -> new\_node1(c) -> None에서 ListQueue.pop()이 행해진 상황을 생각해봅시다.

​

일단 구현된 LinkedList.delete()를 사용하면 4.3은 다음과 같은 형태가 됩니다.

​

new\_node3 -> new\_node2 -> None(c)

​

앞서 우리는 항상 현재위치를 마지막에 두기로 정하였습니다. 이를위해서 다음과 같은 코드를 작성할 수 있습니다.

class ArrayStack: def \_\_init\_\_(self): self.data = Array(10) self.idx = 0 def push(self, value): self.data.set(self.idx, value) self.idx += 1 def pop(self): current\_value = self.list.current.data self.list.delete() self.count -= 1​ self.list.move\_front() for i in range(self.count - 1): self.list.move\_next()​ return current\_value

일단 self.list에서 delete()를 실행하면 위에서 본 new\_node3 -> new\_node2 -> None(c) 형태가 됩니다.노드의 수가 줄어들었으니 self.count를 1 감소시킵니다.

​

이후 맨 처음으로 이동한 후, self.count -1만큼 다시 앞으로 이동해줍니다.

​

이로써 항상 현재값이 맨끝으로 위치하게끔 ListQueue를 구현하였습니다.

​


해당글은 효율성을 고려하지 않고 다양한 관점에서 ListQueue를 구현하는 것에 초점을 두었습니다.

​

자료구조 총정리

총정리