๐์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ - 3
ํ์ต๊ธฐ๋ก
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ์คํ
- ๋งํฌ๋ ๋ฆฌ์คํธ - 1
- ๋งํฌ๋ ๋ฆฌ์คํธ - 2
- ๋งํฌ๋ ๋ฆฌ์คํธ - 3
- ๋งํฌ๋ ๋ฆฌ์คํธ - 4
์คํ
ํน์ง
๊ฐ์ฅ ๋ฆ๊ฒ ๋ค์ด๊ฐ ๊ฒ์ด ๊ฐ์ฅ ๋จผ์ ๋์ค๋ LIFO(Last In First Out)์ ์ฑ๊ฒฉ์ ์ง๋(์ด๋ ๊ฒ ์ ์๋ถ๋ฅด๊ธด ํจ)
ํ์ค ์ ์คํ - ํ๋ง๊ธ์ค
ํ์ค์์ ํ๋ง๊ธ์ค๊ฐ ์คํ์ ๋ํ์ ์ธ ์๊ฐ ์๋๊น? ํ๋ง๊ธ์ค๋ฅผ ํฌ์ฅํ ๋ ๊ฐ์ฅ ๋ฆ๊ฒ๋ฃ์ ์นฉ์ด ๊ฐ์ฅ ๋จผ์ ๋์ค๋๊น
์ฉ์ด
- Push
push๋ ์คํ์ ์์๋ฅผ ์ง์ด๋ฃ๋๋ค. - Pop
pop์ ์คํ์์ ์์๋ฅผ ๊บผ๋ธ๋ค.
๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ์คํ ๊ตฌํ
stack = []
stack.append(1)
stack.append(2)
print(stack.pop())
print(stack.pop())
์คํ ๊ตฌํ์ ํ์ด์ฌ์ ๋ฆฌ์คํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ ๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.
push๋ append๋ก, pop๋ ๊ทธ๋๋ก pop๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ปดํจํฐ์์ ์คํ์ ํ์ฉ
ํ๋ก์ธ์ค ์คํ ๊ตฌ์กฐ๋ฅผ ์ํด ์ฌ์ฉํ๋ค.
def func1():
print("start f1")
func2()
print("end f1")
def func2():
print("start f2")
print("end f2")
def main():
func1()
main()
main์์ func1()์ผ๋ก ๊ฐ๋ฉฐ ๋ง์ง๋ง ๋ค์ ์ฝ๋ ์คํ์์น๋ฅผ pushํ๋ค.
func1์์ โstart f1โ์ ์ถ๋ ฅํ๊ณ , func2๋ฅผ ํธ์ถํ๋ฉฐ ๋ค์ ์ฝ๋ ์คํ์์น๋ฅผ pushํ๋ค.
func2์์ โstart f2โ, โend f2โ๋ฅผ ์ถ๋ ฅํ๋ค.
func2 ํจ์๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ์คํ์์ ๋ค์ ์ฝ๋ ์คํ์์น๋ฅผ popํ๋ค.
func1์์ โend f1โ์ ์ถ๋ ฅํ๋ค.
func1 ํจ์๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ์คํ์์ ๋ค์ ์ฝ๋ ์คํ์์น๋ฅผ popํ๋ค.
main ํจ์๊ฐ ๋๋ฌ๊ณ , ์คํ์์ ๋ค์ ์ฝ๋ ์คํ์์น๊ฐ ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ค.
์ด๋ฐ ์ฝ๋๋ฅผ ์ด์
๋ธ๋ฆฌ์ด๋ก ๋๊ฑธ ๋ณด๋ฉด ๋ช
ํํ๊ฒ ๋ณด์ธ๋ค.
visual studio์์ c๋ฑ์ผ๋ก ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํด์ ๋์ค์ด์
๋ธํด๋ณด๋ฉด ๊ฐ์ฅ ๋ณด๊ธฐ ๊ฐ๋จํ๋ค.
์คํ์ ์ฅ์
- ๊ตฌ์กฐ๊ฐ ๋จ์ํด์ ๊ตฌํํ๊ธฐ ์ฝ๋ค.
- ๋ฐ์ดํฐ ์ ์ฅ, ์ฝ๊ธฐ ์๋๊ฐ ๋น ๋ฅด๋ค.
์คํ์ ๋จ์
- ๋ฐ์ดํฐ์ ์ต๋ ๊ฐฏ์๋ฅผ ๋ฏธ๋ฆฌ ์ ํด์ผํ๋ค. (๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์์ฝํด์ผํ๋ค.)
- ์์ ๋จ์ ์ผ๋ก ์ธํด ๊ณต๊ฐ์ ์ธ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์คํ์ ๋จ์ํจ๊ณผ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ํด ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์ด๋ฌํ ๋จ์ ์๋ ์ ์ ํ ํฌ๊ธฐ์ ๊ณต๊ฐ์ ํ ๋นํด์ ์ฌ์ฉํ๋ ๋ฏํ๋ค.
(๋์ ์ผ๋ก ๊ตฌํํด์ ํด๊ฒฐํ ์๋ ์๊ฒ ์ง๋ง ๊ตณ์ด? ์ด๋ฐ๋๋)
์ฐ๊ฒฐ ๋ฆฌ์คํธ (linked list)
๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ตฌ์กฐ๋ฅผ ๋์ด์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ผ๊ณ ํ๋ค.
๊ตฌ์กฐ
์ ์ฌ์ง์ฒ๋ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๋๊ฒ๋๋๋ฐ,
๊ฐ ๋ฐ์ดํฐ๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๊ณ ์๋ค.
๋ฐ๋ผ์, ๊ฐ ๋ฐ์ดํฐ๋ ๋๊ฐ์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๋๋ฐ โ๋ฐ์ดํฐโ์ โ๋ค์ ๋ฐ์ดํฐ์ ์ฃผ์โ์ด๋ค.
์ด ๋๊ฐ์ง ์ ๋ณด๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ โ๋
ธ๋โ๋ผ๊ณ ํ๋ค.
์ฆ, ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋
ธ๋๋ค์ด ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ธ๋ค.
์ฃผ์๋ ๊ทธ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ํ๋ธ๋ค.
์ฃผ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค.
์ฅ์
- ๊ณต๊ฐ์ ์ ํ์ง ์์๋ ๋๋ค.
- ๊ณต๊ฐ์ ์ธ ๋ญ๋น๊ฐ ์๋ค.
- ์ฝ์ , ์ญ์ ํ ๋ ์๊ฐ์ด ์ ๊ฒ๋ ๋ค.
๋จ์
- ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ๋ฐ์ดํฐ ์ ๊ทผ์๋๊ฐ ๋๋ฆฌ๋ค.
๊ตฌํ
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Llist:
def __init__(self, head=None):
self.head = head
self.size = 1 if head else 0
self.pointer = self.head
def Next(self):
if self.pointer != None and self.pointer.next != None:
self.pointer = self.pointer.next
return self.pointer
def Head(self):
self.pointer = self.head
def Add(self, node):
self.size += 1
if self.head == None:
self.head = node
self.pointer = self.head
else:
node.next = self.pointer.next
self.pointer.next = node
def Delete(self):
if self.size != 0:
if self.head == self.pointer:
self.head = self.head.next
del self.pointer
self.pointer = self.head
else:
node = self.head
while node.next != self.pointer:
node = node.next
node.next = self.pointer.next
del self.pointer
self.pointer = node
self.size -= 1
def Print(self):
if self.head != None:
curnode = self.head
while curnode:
print(curnode.data)
curnode = curnode.next
llist = Llist()
llist.Delete() # ์์ธ์ฒ๋ฆฌ ํ
์คํธ
llist.Next() # ์์ธ์ฒ๋ฆฌ ํ
์คํธ
llist.Add(Node(0))
llist.Next()
llist.Add(Node(1))
llist.Next()
llist.Head()
llist.Add(Node(2))
llist.Print() # 0 2 1
๊ฐ๋จํ๊ฒ data์ next๋ฅผ ํฌํจํ๋ node๋ฅผ ์์ฑํ๊ณ ,
node๋ฅผ ์ด์ฉํด์ ๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ(single linked list)๋ฅผ ์์ฑํ๋ค.
head์ pointer๋ฅผ ์ฌ์ฉํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ค.
head๋ Add/Delete ํ ๋ ์ธ์๋ ๋ณํ์ง ์๋๋ค.
head๋ ์ต์์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ , pointer๋ ํ์์ ์ํ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ค.
๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ํด๋๊ณ ๊ตฌํํ๋ค.
Add(Node) : pointer์ ๋ค์์์น์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ค.
Delete() : pointer์์น์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๋ค.
Next() : pointer๋ฅผ ๋ค์์์น๋ก ์ด๋ํ๋ค.
Head() : pointer๋ฅผ head์์น๋ก ์ด๋ํ๋ค.
์ฌ๋ฌ๊ฐ์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ข ๋ฅ๋ค
- ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ(single linked list) : ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ธ๋ ์ฌ์ฉ (๋จ์ผ, ๋จ๋ฐฉํฅ ๋ฑ์ผ๋ก ๋ถ๋ฆ)
- ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ(double linked list) : ์ด์ ๋ค์ ๋ ธ๋๋ฅผ ๋ชจ๋ ๊ฐ๋ฆฌํค๋ ๋ ธ๋ ์ฌ์ฉ
- ์ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ(circular linked list) : ์ํ์ผ๋ก ์ด๋ฃจ์ด์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ๋๋ฏธ ์ฐ๊ฒฐ๋ฆฌ์คํธ(dummy linked list) : ๋๋ฏธ ๋ ธ๋๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉ
๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ (single linked list)
๋งจ ์ฒ์ ๋ณธ ์ฌ์ง์ด์ ๋ฐฉ๊ธ ๊ตฌํํ ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ด๋ค.
๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
์ฅ์ : ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ค ๊ฐ์ฅ ๊ตฌํํ๊ธฐ ์ฝ๋ค. ๋จ์ : ๋ ธ๋๋ฅผ ์ฝ์ /์ญ์ ํ๋๋ฐ ๊ต์ฅํ ๋๋ฆฌ๋ค.
์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ (double linked list)
๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ด์ ๋
ธ๋์ ์ฃผ์๊ฐ ์ถ๊ฐ๋ ํํ์ด๋ค.
์ฅ์ : ์ด์ ๋ ธ๋๋ก ๋์๊ฐ ์ ์์ด์ ๋ ธ๋๋ฅผ ์ฝ์ /์ญ์ ํ๋๋ฐ ๊ต์ฅํ ๋น ๋ฅด๋ค. ๋จ์ : ๊ตฌํํ๊ธฐ ๋ณต์กํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ