자료ꡬ쑰 및 μ‹€μŠ΅

자료ꡬ쑰 및 μ‹€μŠ΅ - [6] μŠ€νƒ Stack (파이썬으둜 μŠ€νƒ κ΅¬ν˜„) (1)

Mainyoung 2022. 1. 27. 16:44

μŠ€νƒ ADT

μŠ€νƒ ADTλŠ” μž„μ˜μ˜ 개체λ₯Ό μ €μž₯ν•˜λŠ” ν•˜λ‚˜μ˜ 좔상 μžλ£Œν˜•μ΄λ‹€.

μŠ€νƒμ˜ μ€‘μš”ν•œ νŠΉμ§•μœΌλ‘œλŠ” LIFO (Last - In First - Out), ν›„μž…μ„ μΆœμ΄λ‹€. ν›„μž…μ„ μΆœμ΄λž€ 말 κ·ΈλŒ€λ‘œ κ°€μž₯ λ§ˆμ§€λ§‰μ— λ“€μ–΄μ˜¨ 것을 κ°€μž₯ λ¨Όμ € κΊΌλ‚΄λŠ” 것이닀. μ΄λŠ” λ“œλŸΌν†΅μ— 자주 λΉ„μœ λ˜κ³€ ν•œλ‹€.

μŠ€νƒμ—μ„œ λ°μ΄ν„°μ˜ μ‚½μž…κ³Ό μ‚­μ œλŠ” μŠ€νƒμ˜ top이라 λΆˆλ¦¬λŠ” μœ„μΉ˜μ—μ„œ μˆ˜ν–‰λœλ‹€.

μŠ€νƒ

μŠ€νƒ ADT λ©”μ„œλ“œ

μŠ€νƒ ADT의 λ©”μ„œλ“œλ₯Ό μ•Œμ•„λ³΄μž.

- μ£Όμš” μŠ€νƒ λ©”μ„œλ“œ
  push : μ›μ†Œλ₯Ό μ‚½μž…ν•œλ‹€.
  element pop : κ°€μž₯ μ΅œκ·Όμ— μ‚½μž…λœ μ›μ†Œλ₯Ό μ‚­μ œν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

- 보쑰 μŠ€νƒ λ©”μ„œλ“œ
  element top() : κ°€μž₯ μ΅œκ·Όμ— μ‚½μž…λœ μ›μ†Œλ₯Ό (μ‚­μ œν•˜μ§€ μ•Šκ³ ) λ°˜ν™˜
  integer size() : μ €μž₯된 μ›μ†Œμ˜ 수λ₯Ό λ°˜ν™˜
  boolean isEmpty() : 아무 μ›μ†Œλ„ μ €μž₯λ˜μ–΄ μžˆμ§€ μ•Šκ³  λΉ„μ–΄ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜
  iterator elements() : μŠ€νƒ μ›μ†Œ 전체λ₯Ό λ°˜ν™˜

- μ˜ˆμ™Έ
  emptyStackException() : λΉ„μ–΄ μžˆλŠ” μŠ€νƒμ—μ„œ μ‚­μ œλ‚˜ top을 μ‹œλ„ν•  경우 발령
  fullStackException() : λ§Œμ› μŠ€νƒμ—μ„œ μ‚½μž…μ„ μ‹œλ„ν•  경우 발령
 

 

μŠ€νƒ ADT κ΅¬ν˜„

μŠ€νƒ ADT도 λ‹€λ₯Έ 것과 λ§ˆμ°¬κ°€μ§€λ‘œ λ°°μ—΄κ³Ό μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

νŒŒμ΄μ¬μ—μ„œλŠ” 리슀트둜 μŠ€νƒμ„ μ†μ‰½κ²Œ 흉내낼 수 μžˆλ‹€.

>>> a = []
>>> a.append(1) # 1 μΆ”κ°€
>>> a.append(2) # 2 μΆ”κ°€
>>> print(a)
[1,2]

>>> a.pop() # 2 꺼냄
>>> print(a) 
[1]

 

μ—°κ²°λ¦¬μŠ€νŠΈμ— κΈ°μ΄ˆν•œ μŠ€νƒ

단일 μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€νƒμ„ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ΄λ•Œ μ‚½μž…κ³Ό μ‚­μ œκ°€ νŠΉμ •μœ„μΉ˜μΈ topμ—μ„œλ§Œ μˆ˜ν–‰λ˜λ―€λ‘œ ν—€λ”λ…Έλ“œλŠ” ν•„μš”μ—†λ‹€.

 

μ΄ˆκΈ°ν™”

μ΄ˆκΈ°μ—λŠ” 아무 λ…Έλ“œλ„ μ—†λ‹€.

λ‹¨μΌμ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ μŠ€νƒ μ΄ˆκΈ°ν™” μ˜μ‚¬μ½”λ“œ

μ‚½μž…

 

λ‹¨μΌμ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ μŠ€νƒ μ‚½μž… μ˜μ‚¬μ½”λ“œ

μ‚½μž… ν›„ top의 관리λ₯Ό μž˜ν•΄μ•Ό ν•œλ‹€.

 

μ‚­μ œ

 

λ‹¨μΌμ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ μŠ€νƒ μ‚­μ œ μ˜μ‚¬μ½”λ“œ

μ‚­μ œ λ˜ν•œ μ‚½μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ top의 관리λ₯Ό μž˜ν•΄μ•Ό ν•œλ‹€.

 

이λ₯Ό 파이썬 μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

#λ‹¨μΌμ—°κ²°λ¦¬μŠ€νŠΈμ— κΈ°μ΄ˆν•œ μŠ€νƒ
class Node:
  def __init__(self,data,next=None):
    self.data = data
    self.next = next

class stack:
  def __init__(self,N): #μ΄ˆκΈ°ν™”
    self.top = None
    self.full = N
    self.stacksize=0

  def push(self,data): # μ‚½μž…
    newnode = Node(data,self.top)
    self.top = newnode
    self.stacksize +=1

  def isEmpty(self): # isEmpty
    if self.top == None:
      return True
    else:
      return False
  
  def pop(self): # pop
    if self.isEmpty():
      print("Stack Empty")
    elem = self.top.data
    p = self.top
    self.top = self.top.next
    del(p)
    self.stacksize -=1
    # print("pop :",elem) #popν•œ μ›μ†Œλ₯Ό 좜λ ₯
    return elem
  
  def printstack(self): # μŠ€νƒprint
    target = self.top
    if self.isEmpty():
      print("None")
    else:
      while (target.next != None):
        print(target.data,end = ",")
        target = target.next
      print(target.data)
  
  def peek(self): # top에 μžˆλŠ” μ›μ†Œ 좜λ ₯
    if self.top == None:
      print("Stack Empty")
    else:
      print(self.top.data)
  
  def duplicate(self): # popν›„ 같은 μ›μ†Œ λ‘λ²ˆ push
    new = self.pop()
    if self.stacksize ==self.full:
      print("Stack Full")
    else:
      self.push(new)
    if self.stacksize ==self.full:
      print("Stack Full")
    else:
     self.push(new)
>>> a = stack(5)
>>> a.push('C')
>>> a.push('B')
>>> a.push('A')
>>> a.printstack()
A,B,C
>>> a.pop() #Aλ₯Ό μ‚­μ œν•˜κ³  좜λ ₯
A
>>> a.peek() # popκ³Ό 달리 μ‚­μ œν•˜μ§€ μ•Šκ³  top에 μ €μž₯된 μ›μ†Œ 좜λ ₯
B
>>> a.duplicate() # 볡사
>>> a.printstack()#print
B,B,C
728x90