๐Ÿ‘‰์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜ - 3

ํ•™์Šต๊ธฐ๋ก

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ์Šคํƒ
  2. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ - 1
  3. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ - 2
  4. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ - 3
  5. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ - 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)

์–‘๋ฐฉํ–ฅ
๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ์ด์ „ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ํ˜•ํƒœ์ด๋‹ค.

์žฅ์  : ์ด์ „๋…ธ๋“œ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด์„œ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…/์‚ญ์ œํ•˜๋Š”๋ฐ ๊ต‰์žฅํžˆ ๋น ๋ฅด๋‹ค. ๋‹จ์  : ๊ตฌํ˜„ํ•˜๊ธฐ ๋ณต์žกํ•˜๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ