[자료ꡬ쑰] 3. μŠ€νƒ

3κ°•. μŠ€νƒ

1. μŠ€νƒμ˜ κ°œλ…

  • TOP : μŠ€νƒμ—μ„œ κ°€μž₯ μ΅œκ·Όμ— μ‚½μž… 된 자료의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 지칭
  • push : μŠ€νƒμ— 자료 ν•˜λ‚˜λ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜. μŠ€νƒμ˜ μ €μž₯곡간이 μΆ©λΆ„ν•œμ§€ 확인해야 ν•œλ‹€.
  • pop : μŠ€νƒμ˜ μ΅œμƒλ‹¨ μžλ£Œν˜•μ„ λ°˜ν™˜(제거) ν•˜λŠ” ν•¨μˆ˜. μŠ€νƒμ— 데이터가 μ‘΄μž¬ν•˜λŠ”μ§€ 확인해야 ν•œλ‹€.

2. μŠ€νƒμ˜ 좔상 μžλ£Œν˜•

  1. Stack CreateS(maxStackSize)
  2. μŠ€νƒμ˜ 크기가 maxStackSize인 빈 μŠ€νƒμ„ μƒμ„±ν•˜κ³  λ°˜ν™˜ν•œλ‹€.
  3. Boolean IsFull(stack, maxStackSize)
  4. μŠ€νƒμ΄ 가득 μ°ΌλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
  5. Stack Push(stack, item)
  6. μŠ€νƒμ΄ 가득 차지 μ•Šμ•˜λ‹€λ©΄ μ΅œμƒλ‹¨ λ©”λͺ¨λ¦¬μ— 데이터λ₯Ό μ‚½μž…ν•œλ‹€.
  7. Boolean IsEmpty(stack)
  8. μŠ€νƒμ— μžλ£Œκ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
  9. Element Pop(stack)
  10. μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•œ λ’€ 그렇지 μ•Šλ‹€λ©΄ μ΅œμƒλ‹¨μ˜ 자료λ₯Ό κΊΌλ‚΄ μ‚­μ œν•˜κ³  λ°˜ν™˜ν•œλ‹€.

3. μŠ€νƒμ˜ μ‘μš©

  1. μ‹œμŠ€ν…œ μŠ€νƒ(system stack)
  2. λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ° 관리λ₯Ό μœ„ν•΄ μ‚¬μš©
  3. μ„œλΈŒλ£¨ν‹΄ 호좜(subroutine call)
  4. μ„œλΈŒλ£¨ν‹΄μ˜ μˆ˜ν–‰μ΄ λλ‚œ ν›„ λ˜λŒμ•„κ°ˆ ν•¨μˆ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
  5. μˆ˜μ‹ 계산(evaluation of expression)
  6. μ—°μ‚°μžλ“€ κ°„μ˜ μš°μ„ μˆœμœ„μ— μ˜ν•΄ 계산 μˆœμ„œλ₯Ό κ²°μ •
  7. μΈν„°λŸ½νŠΈ(interrupt) μ²˜λ¦¬μ™€ 처리 ν›„ λ˜λŒμ•„κ°ˆ λͺ…λ Ή μˆ˜ν–‰μ§€μ  μ €μž₯
  8. 컴파일러의 문법 검사, μˆœν™˜ 호좜 λ“±…

4. μŠ€νƒμ˜ μ—°μ‚°

직접 κ΅¬ν˜„μœΌλ‘œ 정리

5. 배열을 μ΄μš©ν•œ μŠ€νƒμ˜ κ΅¬ν˜„

직접 κ΅¬ν˜„μœΌλ‘œ 정리

νŒŒμ΄μ¬μ„ μ΄μš©ν•œ μŠ€νƒ κ΅¬ν˜„

class Stack:      # μŠ€νƒ λ©”λͺ¨λ¦¬λ₯Ό μ €μž₯ν•  λ³€μˆ˜     # 생성과 λ™μ‹œμ— μ΄ˆκΈ°ν™” 됨. μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 private ν•˜κ²Œ μ„ μ–Έν•΄μ•Ό 함.     # 멀버 λ³€μˆ˜ μ•žμ— '__'λ₯Ό 뢙이면 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†μŒ     __node = None      # μŠ€νƒ μ΅œμƒλ‹¨ 인덱슀λ₯Ό κ°€λ₯΄ν‚€λŠ” ν•¨μˆ˜     # None 으둜 μ„ μ–Έν•  μ‹œ μ¦κ°μ—°μ‚°μžμ—μ„œ μ—λŸ¬κ°€ λ‚˜λ―€λ‘œ -1둜 μ„ μ–Έ     top = -1      # μŠ€νƒ μ΅œλŒ€ μ €μž₯곡간     max_stack_size = 0      # μŠ€νƒ 객체 μ΄ˆκΈ°ν™”μ™€ λ™μ‹œμ— μ„ μ–Έ     def __init__(self, max_stack_size_p):         self.__node = list()         self.max_stack_size = max_stack_size_p      # μŠ€νƒμ΄ 가득 μ°ΌλŠ”μ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜     # μŠ€νƒμ˜ μ΅œμƒλ‹¨μ˜ μ£Όμ†Œκ°€ κ°€λ₯΄ν‚€λŠ” 값이 μŠ€νƒμ˜ λ©”λͺ¨λ¦¬ μ΅œλŒ€κ°’ μ£Όμ†Œμ™€ μΌμΉ˜ν•  λ•Œ          # is_full True λ₯Ό λ¦¬ν„΄ν•œλ‹€.     def is_full(self):         if self.top == self.max_stack_size - 1:             return True         else:             return False      # μŠ€νƒμ— object λ₯Ό ν•˜λ‚˜ λ°€μ–΄λ„£λŠ” ν•¨μˆ˜     # μŠ€νƒμ— 곡간이 μžˆλ‹€λ©΄ μ›μ†Œλ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•˜κ³  그렇지 μ•Šλ‹€λ©΄ λ°˜ν™˜ν•¨     def push(self, item):         if self.is_full():             print('this stack is full')         else:             self.__node.append(item)             self.top += 1             return self      # μŠ€νƒμ— μžλ£Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜     # μžλ£Œκ°€ μ—†λ‹€λ©΄ true λ₯Ό λ°˜ν™˜ν•˜κ³  그렇지 μ•Šλ‹€λ©΄ false λ₯Ό λ°˜ν™˜ν•¨     def is_empty(self):         if self.top < 0:             return True         else:             return False      # μŠ€νƒ λ©”λͺ¨λ¦¬ μ΅œμƒλ‹¨ 자료λ₯Ό μ‚­μ œν•˜κ³  λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜     # μŠ€νƒμ΄ λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ μ‹€ν–‰ κ°€λŠ₯     def pop(self):         if self.is_empty():             print('this stack is empty')         else:             self.top -= 1             return self.__node.pop()

6. μ‚¬μΉ™μ—°μ‚°μ‹μ˜ μ€‘μœ„/ν›„μœ„/μ€‘μœ„ ν‘œν˜„

6.1 μ „μœ„ ν‘œκΈ°λ²•

μ—°μ‚°μžλ₯Ό ν”Όμ—°μ‚°μž μ•žμ— κ°€μ Έλ‹€ λ†“λŠ” 방법 ex) 'A+B' → '+AB'

μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ μ²˜λ¦¬ν•˜κΈ° μƒλ‹Ήνžˆ λ³΅μž‘ν•¨. μ‚¬λžŒμ΄ ν•˜λŠ”κ²Œ 더 빠름

6.2 ν›„μœ„ ν‘œκΈ°λ²•

A + Bλ₯Ό AB+ 와 같이 ν‘œν˜„ν•˜λŠ” 기법. 컴퓨터가 ν•΄μ„ν•˜κΈ° μ’‹μŒ

ex) E + (A - B) * C/D → E(((AB-)C*)D/)+