[μλ£κ΅¬μ‘°] μ€ν(Stack)
πκΈ°μ λ©΄μ μ§λ¬Έ
Q. μ€ν(Stack)μ λν΄ μ€λͺ νκ³ μμ μμ€λ₯Ό ꡬνν΄λ³΄μλΌ
Q. μ€νκ³Ό νμ μ°¨μ΄λ 무μμΌκΉμ?
Q. νμ΄νΈλ³΄λμ νλ‘ μ€νμ ꡬνν΄ λ³΄λΌ. (λ₯μ¨)
Q. μ€νκ³Ό λ§ν¬λ리μ€νΈμ 리μ€νΈμ μ°¨μ΄μ μ μ€λͺ ν΄ λ³΄μΈμ. (λ€μ΄λ²)
Q. μ€ν μ€λ²νλ‘μ°κ° μ μΌμ΄λλκ°?
Stack
- μ€ν : ν μͺ½ λμμλ§ μλ£λ₯Ό λ£κ³ λΊ μ μλ μ ν μλ£κ΅¬μ‘°
- κ°μ₯ λ§μ§λ§μ λ€μ΄μ¨ λ°μ΄ν°κ° κ°μ₯ λ¨Όμ λκ°λ LIFO(Last In First Out)λ°©μμ μ¬μ©
- μ€ν곡κ°μ΄ κ°λμ°Όμ λ λ°μ΄ν°λ₯Ό λ λ£μΌλ €κ³ ν κ²½μ° νλ‘κ·Έλ¨μ μ€λ₯κ° λ°μνλ κ²μ Overflow μνλΌκ³ νλ©°, λ°λλ‘ μ€ν μ μ₯곡κ°μ λ°μ΄ν°κ° μλλ° νλ‘κ·Έλ¨μμ μ€νμμ λ°μ΄ν°λ₯Ό κΊΌλ΄λ €κ³ ν κ²½μ° νλ‘κ·Έλ¨μ μ€λ₯κ° λ°μνλ κ²μ Underflow μνλΌκ³ ν¨
- μ½μ (Push)κ³Ό μ κ±°(Pop)λ λͺ¨λ Topμ΄λΌλ μ€νμ νμͺ½ λμμλ§ μΌμ΄λ¨
μ€νμ ꡬν : μ°μ°
μ€νμ μλ μ°μ°λ€λ‘ μΆμνν μ μλ€.
- push - μ€ν 맨μμ νλͺ©μ μ½μ
- pop - μ€ν 맨μμ νλͺ© μμ
- peek - μ€νμ 맨 μ(top)λ₯Ό νμ (μ½κΈ° : μλ³Έμ΄ μ μ§λ¨)
- isEmpty - μ€νμ΄ λΉμ΄μλμ§ νμΈ
- isFull - μ€νμ΄ κ°λ μ°¨ μλμ§ νμΈ
- getSize - μ€νμ μλ μμ μλ₯Ό λ°ν
κΈ°λ³Έλμ
Push
λ°μ΄ν°λ₯Ό μ€νμ λ£λ μμ μ push λΌκ³ νλ€. pushλ λ€μ λ¨κ³λ₯Ό κ±°μΉλ€.
- 1 λ¨κ³ - μ€νμ΄ κ°λ μ°Όλ μ§ νμΈ
- 2 λ¨κ³ - μ€νμ΄ κ°λ μ°¨λ©΄ μ€λ₯κ° λ°μνκ³ μ’ λ£λλ€.
- 3 λ¨κ³ - μ€νμ΄ κ°λ μ°¨μ§ μμΌλ©΄ Topμ μ¦κ°μν¨λ€.
- 4 λ¨κ³ - Topμ΄ κ°λ¦¬ν€λ μ€ν μμΉμ λ°μ΄ν°λ₯Ό μΆκ°νλ€.
Pop
λ°μ΄ν°λ₯Ό μ€νμ μ κ±°νλ μμ μ popμ΄λΌκ³ νλ€. popμ λ€μ λ¨κ³λ₯Ό κ±°μΉλ€.
- 1 λ¨κ³ - μ€νμ΄ λΉμ΄ μλμ§ νμΈνλ€.
- 2 λ¨κ³ - μ€νμ΄ λΉμ΄ μμΌλ©΄ μ€λ₯κ° λ°μνκ³ μ’ λ£νλ€.
- 3 λ¨κ³ - μ€νμ΄ λΉμ΄ μμ§ μμΌλ©΄ Top μ΄ κ°λ¦¬ν€λ λ°μ΄ν°λ₯Ό μ κ±°νλ€.
- 4 λ¨κ³ - Top κ°μ κ°μμν¨λ€.
- 5 λ¨κ³ - μ±κ³΅μ λ°ννλ€.
μκ°λ³΅μ‘λ (Time Complexity)
- push(), pop()μ μκ°λ³΅μ‘λλ λ O(1) : μ½μ , μμ κ° νμ Topμμλ§ μΌμ΄λκΈ° λλ¬Έ
- search()μ μκ°λ³΅μ‘λ O(n) : νΉμ λ°μ΄ν°λ₯Ό μ°Ύμ λλ νΉμ λ°μ΄ν°λ₯Ό μ°Ύμ λκΉμ§ μνμ ν΄μΌνκΈ° λλ¬Έ
ꡬν
ꡬν λ°©λ²μλ λ κ°μ§κ° μλ€.
λ°°μ΄ μ¬μ© (CμΈμ΄ λ±)
- μ₯μ : ꡬννκΈ° μ¬μ
- λ¨μ : ν¬κΈ°κ° λμ μ΄ μλ. λ°νμμ νμμ λ°λΌ λκ±°λ μ€μ§ μμ
μ°κ²°λ¦¬μ€νΈ μ¬μ©
- μ₯μ : ν¬κΈ°κ° λμ μ. λ°νμμ νμμ λ°λΌ ν¬κΈ°κ° νμ₯ λ° μΆμλ μ μμ
- λ¨μ : ν¬μΈν°λ₯Ό μν μΆκ° λ©λͺ¨λ¦¬ 곡κ°μ΄ νμν¨
class Stack:
def __int__(self): # λ°μ΄ν° μ μ₯μ μν 리μ€νΈ μ€λΉ ([special method](https://www.notion.so/special-method-c7a701bed79c4e1ea37a5231ac996af1))
self.items = []
def push(self, val):
self.items.append(val)
def pop(self):
try
return self.items.pop()
except IndexError: # popν μμ΄ν
μ΄ μμΌλ©΄
print("Stack is empty") # indexError λ°μ
def peek(self):
try:
return self.items[-1]
except IndexError:
print("Stack is empty")
def __len__(self): # len()λ‘ νΈμΆνλ©΄ stackμ item μ λ°ν
return len(self.items)
μ€νμ νμ©
μμ 1. κ΄νΈ κ²μ¬
stackμ μ΄μ©ν΄μ νΈλ κΈ°λ³Έμ μ΄κ³ λνμ μΈ λ¬Έμ
β μ£Όμ΄μ§ μ λ ₯μμ κ΄νΈ {}, ()κ° μ λλ‘ μ§μ μ΄λ€λμ§ κ²μ¬νλ νλ‘κ·Έλ¨μ λ§λμμ€. - μλ₯Ό λ€μ΄ {( )}λ μ λλ‘ λ μ§μ΄μ§λ§, {( })λ μ λλ‘ λ μ§μ΄ μλλ€. - μ λ ₯μ ν μ€μ νμ΄μ¬ μ½λμΌμλ μκ³ , κ΄νΈλ§ μ£Όμ΄μ§ μλ μλ€. - μ μμ μΌλ‘ μ§μ μ΄λ£¬ κ²½μ° 1, κ·Έλ μ§ μμΌλ©΄ 0μ μΆλ ₯νλ€. - print(‘{‘) κ°μ κ²½μ°λ μ λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμΌλ―λ‘ κ³ λ €νμ§ μμλ λλ€. - κ° μ€λ§λ€ "#T" (Tλ ν μ€νΈ μΌμ΄μ€ λ²νΈ)λ₯Ό μΆλ ₯ν λ€, λ΅μ μΆλ ₯νλ€.
μμ
μΆλ ₯
3
print({} {}'.format(1,2))
N, M = map(int, input(), split())
print('#{} {}'.format(tc, find())
#1 1
#2 1
#3 0
μ½λ
def bracket_check(val): # κ΄νΈμ μ§ λμ
λ리
matching_dict = {'}': '{', ')': '('}
stack = []
for i in val:
if i in ('{', '('): # μ΄λ¦° κ΄νΈλ₯Ό μ°ΎμΌλ©΄ μ€νμ push
stack.append(i)
elif i in ('}', ')'): # λ«ν κ΄νΈλ₯Ό μ°ΎμΌλ©΄
if not stack or stack[len(stack) - 1] != matching_dict[i]: # μ€νμ΄ λΉμ΄μκ±°λ κ΄νΈμ μ§μ΄ λ§μ§ μμΌλ©΄
return 0
else:
stack.pop() # μ§μ΄ λ§μΌλ©΄ pop
if stack: # κ²μ¬ νμλ μ€νμ κ΄νΈκ° λ¨μ μμΌλ©΄
return 0
else:
return 1
T = int(input())
for tc in range(T):
print('#%d %d' % (tc + 1, bracket_check(input())))
μμ 2 : νμ νκΈ° μμμ κ³μ°
μ€μ νκΈ°λ²κ³Ό νμ νκΈ°λ²
- μ€μ νκΈ°λ² (infix notation)
- μ°λ¦¬κ° μΌμμμ μ¬μ©νλ μμμ νκΈ°λ²
- μ°μ°μκ° νΌμ°μ°μλ€μ μ¬μ΄μ μμΉ
- (A + B) * (C + D)
- νμ νκΈ°λ² (postfix notation)
- μ»΄ν¨ν°κ° μμμ κ³μ°νλλ° μ 리ν¨
- μ°μ°μκ° νΌμ°μ°μλ€μ λ€μ μμΉ
- A B + C D + *
-> μ€νμΌλ‘ ꡬνν μ μλ λνμ μΈ μμλ‘λ
- μ€μ νκΈ°λ² μμμ νμ νκΈ°λ² μμμΌλ‘ λ³ννλ μκ³ λ¦¬μ¦
- νμ νκΈ°λ² μμμ κ³μ°νλ μκ³ λ¦¬μ¦
μ΄ μλ€.
⇒ 리μ€νΈλ₯Ό νμ©νμ¬ 2. νμ νκΈ°λ² μμμ κ³μ°νλ©΄ λ€μκ³Ό κ°λ€.
β μ λ ₯: {“2”, “3”, “5”, “+”, “*”, “7”, “-“} μΆλ ₯: 10
ꡬν
def Calculate(tokens):
stack = []
for token in tokens:
if token == '+':
stack.append(stack.pop()+stack.pop())
elif token == '-':
stack.append(-(stack.pop()-stack.pop()))
elif token == '*':
stack.append(stack.pop()*stack.pop())
elif token == '/':
rv = stack.pop()
stack.append(stack.pop()/rv)
else:
stack.append(int(token))
return stack.pop()
print(Calculate(["2", "3", "5", "*", "+", "7", "-"]))
'Computer Science > Data Structure' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ£κ΅¬μ‘°] νΈλ¦¬ (Tree) (0) | 2022.04.26 |
---|---|
[μλ£κ΅¬μ‘°] μ°κ²°λ¦¬μ€νΈ(Linked List) (0) | 2022.03.11 |
[μλ£κ΅¬μ‘°] ν(Queue) (0) | 2022.03.10 |
[μλ£κ΅¬μ‘°] μ¬κ·(Recursion) (0) | 2022.03.10 |
[μλ£κ΅¬μ‘°] μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦ (0) | 2022.03.08 |