π§βοΈstack / queue / deque λͺ¨λ νΉμ μμΉμμλ§ μμλ₯Ό λ£κ±°λ λΊ μ μλ restricted structure
1. stack
π§βοΈ μ€νμ΄λ, ν μͺ½μΌλ‘λ§ λ°μ΄ν°λ₯Ό λΉΌκ³ λ£μ μ μλ μλ£κ΅¬μ‘°λ‘, ν μͺ½λ§ ꡬλ©μ΄ λ«λ € μλ νλ§κΈμ€ ν΅μ μκ°νλ©΄ λλ€. λ¨Όμ λ€μ΄μ¨ λ°μ΄ν°κ° λμ€μ λκ°λ νμ - μ¦ λμ€μ λ€μ΄μ¨ λ°μ΄ν°κ° λ¨Όμ λκ°λ νμ(μ μ νμΆ FILO)μ μλ£κ΅¬μ‘°. μ ꡬμ μΆκ΅¬κ° λμΌν ννλ‘ λ§€μ° κ°λ¨ν λ μ°μ°(μμ μΆκ° O(1), μμ μ κ±° O(1))μ΄ μ 곡λλ€. μ μΌ μλ¨μ μμ νμΈμ O(1), μ μΌ μλ¨μ΄ μλ λλ¨Έμ§ μμλ€μ νμΈ/λ³κ²½μ μμΉμ μΌλ‘ λΆκ°λ₯νλ€. νμ μ€ν μλ¨μλ§ μ΄μ μ΄ λμ΄ μμ. λ°λΌμ μ½μ ν λμλ κ°μ₯ μ΅κ·Όμ μ½μ ν μμ λ°λ‘ μμ μ½μ μ΄ λκ³ , μμ ν λλ κ°μ₯ μ΅κ·Όμ μ½μ ν μμκ° μμ λλ€. λ°λΌμ μ€νμ μ μΌ μλ¨μ μμ μΆκ° & μ μΌ μλ¨ μμ μ κ±° & μ μΌ μλ¨ μμ νμΈ - μ΄λ κ² 3κ°μ§ μ°μ°μ΄ μ£Όκ° λλ€. λ°λΌμ μ€ν νμ© λ¬Έμ λ μ μΌ μλ¨μ΄ μλ λλ¨Έμ§ μμλ€μ νμΈ/λ³κ²½μ νμ x.
operations
(1) push operation: adds an item to the stack
β before pushing the element to the stack, we check 'if the stack is full'
β‘ if the stack is full, then 'stack overflow' (we cannot insert the element to the stack)
β’ otherwise, we increment the value
β£
β€
β₯
β νμ΄μ¬
π§βοΈ pythonμΌλ‘μ ꡬνμ listλ₯Ό νμ©ν΄μ κ°λ₯. μ μΌ μλ¨μ listμ μ€λ₯Έμͺ½ λμ΄λΌ λ³΄κ³ , μ μΌ μλ¨μ μμ μΆκ°λ append(), μ μΌ μλ¨ μμ μ κ±°λ pop(), μ μΌ μλ¨ μμ νμΈμ arr[-1]μ νμ©ν΄μ κ°λ₯ - λͺ¨λ μκ°λ³΅μ‘λ O(1)λ‘ λ§€μ° λΉ λ₯Έ μκ° λ΄μ operation μν κ°λ₯. μλ₯Ό λ€μ΄ μ½μ 5 - μ½μ 2 - μ½μ 3 - μ½μ 7 - μμ - μ½μ 1 - μ½μ 4 - μμ μμΌλ‘ stack μ°μ°μ ꡬννλ€λ©΄ μλμ κ°λ€.
stack = []
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()
print(stack[::-1]) #print from the topmost [1, 3, 2, 5]
print(stack) #print from the bottommost [5, 2, 3, 1]
β‘ c++
π§βοΈ #include <stack>μΌλ‘ λΌμ΄λΈλ¬λ¦¬λ₯Ό importν λ€, stack<int> sμ κ°μ΄ stackμ λ€μ΄κ° μλ£ν <>μ λ£μ΄μ£Όκ³ stack μ΄λ¦μ λ§λ€μ΄ stack μμ±.
π§βοΈ ex) stack μ΄λ¦μ sλΌ νλ©΄, s.push(5)λ‘ stackμ 5λ₯Ό λ£κ³ , s.pop()μΌλ‘ stackμ μ΅μλ¨μ μλ μμ μ κ±°. s.empty() ν¨μλ‘ stackμ΄ λΉμλ μ§ μ λΉμλ μ§ bool data return. s.top()μ νμ©ν΄ stackμ μ΅μλ¨μ μλ μμ νμΈ(μ κ±° x)
#include <stack>
using namespace std;
stack<int> s;
int main(){
s.push(5);
s.push(2);
s.push(3);
s.push(7);
s.pop();
s.push(1);
s.push(4);
s.pop();
while(!s.empty()){
cout << s.top() << ' ';
s.pop();
}
}
2. queue
π§βοΈ ν(queue)λ μ€νκ³Ό λ€λ₯΄κ² λ¨Όμ λ€μ΄μ¨ λ°μ΄ν°κ° λ¨Όμ λκ°λ νμ(μ μ μ μΆ FIFO)μ μλ£κ΅¬μ‘°μ΄λ€. μ΄λ μ ꡬμ μΆκ΅¬κ° λͺ¨λ λ«λ € μλ ν°λκ³Ό κ°μ ννλ‘ μλμ κ°μ΄ μκ°νν μ μλ€. μλ₯Ό λ€μ΄ λ¨Όμ λ€μ΄μ¨ μ¬λμ΄ λ¨Όμ μ²λ¦¬λλ λκΈ°μ΄μ ꡬνν λ νλΌλ μλ£κ΅¬μ‘°λ₯Ό μ¬μ©ν μ μλ€. νμͺ½ λμμ μμλ₯Ό λ£κ³ λ°λμͺ½ λμμ μμλ₯Ό λΊ μ μλ μλ£κ΅¬μ‘°. ν μͺ½ μμ μΆκ° O(1), κ·Έ λ°λμͺ½ μμ μ κ±° O(1), λν μ μΌ μκ³Ό λ€ μμ κ°κ° νμΈμ O(1)μ΄λ©° μ μΌ μ/λ€κ° μλ λλ¨Έμ§ μμλ€μ νμΈ/λ³κ²½μ μμΉμ μΌλ‘ λΆκ°λ₯νλ€. μ€νκ³Ό λ€λ₯΄κ² λκ°κ³ λ€μ΄μ€λ μ ꡬ/μΆκ΅¬κ° λ€λ₯΄μ§λ§, 곡ν΅μ μ λͺ¨λ μΆ/μ κ΄λ ¨ μλ μμλ€μ νμΈ/λ³κ²½μ λΆκ°λ₯νλ€λ μ .
π§βοΈ pythonμΌλ‘μ ꡬνμ collections λͺ¨λμ deque() ν¨μλ₯Ό νμ©ν΄μ κ°λ₯. μ€λ₯Έμͺ½ λ€μͺ½μμ μμλ₯Ό λ£μ λλ append(), μΌμͺ½ μμͺ½μμ μμλ₯Ό λΊ λλ popleft()(κ·Έ λ°λλ‘ μμͺ½μμ μμλ₯Ό λ£κ³ μΆλ€λ©΄ appendleft(), μ€λ₯Έμͺ½ λ€μͺ½μμ μμλ₯Ό λΉΌκ³ μΆλ€λ©΄ pop() μ¬μ© κ°λ₯. λ€λ§, queueλ λ€μ΄μ€κ³ λκ°λ λ°©ν₯μ νμ΄νκ° λμΌνλ€λ μ ) append(), appendleft(), pop(), popleft() λͺ¨λ μκ°λ³΅μ‘λ O(1). μλ₯Ό λ€μ΄ μ½μ 1 - μ½μ 2 - λΉΌκΈ° 1 - λΉΌκΈ° 2 - μ½μ 3 - μ½μ 4 - μ½μ 5 μμλ μλμ κ°μ΄ μ½λλ‘ κ΅¬νν μ μλ€.
β νμ΄μ¬
from collections import deque
queue = deque()
queue.appendleft(1)
queue.appendleft(2)
queue.pop()
queue.pop()
queue.appendleft(3)
queue.appendleft(4)
queue.appendleft(5)
print(queue) #deque([5, 4, 3])
β‘ c++
π§βοΈ <queue> import νκ³ μ€λ₯Έμͺ½μμ push(), μΌμͺ½μμ pop(), front()λ 맨 μΌμͺ½ μμ νμΈ / back()μ 맨 μ€λ₯Έμͺ½ μμ νμΈ
#include <queue>
using namespace std;
queue<int> q;
int main(){
q.push(5);
q.push(2);
q.push(3);
q.push(7);
q.pop();
q.push(1);
q.push(4);
q.pop();
while(!q.empty()){
cout << q.front() << ' '; // q.back()
q.pop();
}
}
3. deque
π§βοΈ λ±(deque)μ΄λ, νμ λ€λ₯΄κ² μμͺ½ λμμ μ½μ κ³Ό μμ κ° μ λΆ κ°λ₯ν μλ£κ΅¬μ‘°. Double-Ended queueμ μ€μλ§. μμμ μΆκ° / μ κ±° λͺ¨λ O(1), μ μΌ μ/λ€μ μμ νμΈμ O(1), μ μΌ μ/λ€κ° μλ λͺ¨λ μμλ μμΉμ μΌλ‘ λ³κ²½/μ κ·Ό λΆκ°λ₯. μ΄ λ queueμ λ€λ₯Έ μ μ μμͺ½ λ λͺ¨λμμ μμ λ‘κ² λ£κ³ λΊ μ μλ€λ μ .
β νμ΄μ¬
π§βοΈ pythonμΌλ‘μ ꡬνμ μ queueμ λ§μ°¬κ°μ§λ‘ collectionsμ deque() νμ©. μ queue()μ λμΌνκ² append(), appendleft(), pop(), popleft() μ¬μ© κ°λ₯νλ€. νμ listμ ν¨μλ‘ λ§μ΄ μ°λ index(), insert(), remove(), count(), reverse() μ¬μ© κ°λ₯. 1κ°κ° μλ 2κ° μ΄μμ μμλ₯Ό λμμ λ£λ extend(), extendleft()λ μ¬μ© κ°λ₯νλ©° μ§μ ν μΉΈ λ§νΌ μμ§μ΄λ rotate() ν¨μλ μλ€. μλ₯Ό λ€μ΄ deque([1, 2, 3, 4, 5])κ° μλ€λ©΄ rotate(2)λ₯Ό ν κ²½μ° μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ 2μΉΈ μμ§μ΄κ³ μ€λ₯Έμͺ½μμ λΉ μ§ μμλ λμμ μΌμͺ½μΌλ‘ λ€μ΄κ°λ€. deque([5, 4, 1, 2, 3])μ΄ λλ€. λ°λ λ°©ν₯μ rotate(-2)μ΄κ³ μκ° λ³΅μ‘λλ O(k) (kκ°μ μμ μμ§μΈλ€λ©΄) μλ₯Ό λ€μ΄ 86κ³Ό 23, 17μ μ°¨λ‘λλ‘ μΌμͺ½μ λ£κ³ , μ€λ₯Έμͺ½μμ 86μ λΊ λ€ μ€λ₯Έμͺ½μμ 30μ λ£κ³ μΌμͺ½μμ 17μ λΉΌλ κ³Όμ μ μλμ κ°μ΄ μ½λλ‘ κ΅¬νν μ μλ€.
from collections import deque
deque = deque()
deque.appendleft(86)
deque.appendleft(23)
deque.appendleft(17)
deque.pop()
deque.append(30)
deque.popleft()
print(deque) #deque([23, 30])
π§βοΈ arrayμ dequeμ λΉκ΅νμλ©΄ arrayλ μ€κ°μ μλ λͺ¨λ μμλ€λ O(1)μ λλ€ μ κ·Ό κ°λ₯. νμ§λ§ dequeμ μ λμ μμ 1κ°μ©μ deletion, insertionμ΄ O(1)μΈ μλ£κ΅¬μ‘°(νμ§λ§ arrayλ μ½μ κ³Ό λΉΌλ΄κΈ° μ°μ° λͺ¨λ O(n)). νμ§λ§ dequeμ νΉμ μμ μ κ·Όμ O(n). λ°λΌμ dequeμ, dequeμ μ΄λ€ μμκ° λ€μ΄κ°λμ§ μκ΄νμ§ μκ³ νΉμ μμλλ‘ λ°μ΄ν°λ₯Ό μ§μ΄λ£κ³ λΉΌλ΄λ μ°μ°μ μν λ λ§μ΄ μ°μ.
β‘ c++
π§βοΈc++μ μ§μ <deque> libraryλ₯Ό #includeνλ©΄ λλ€. push_front(), push_back(), pop_front(), pop_back(), front(), back() νμ©
μ΄μ½ν 2021
BaaarkingDog
'Computer Science > Data Structures' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π³ Binary Tree π³ (1) | 2023.12.19 |
---|---|
π Map (0) | 2023.08.03 |
Types of Binary Treeπ² (0) | 2023.01.10 |
π―Priority Queue(feat. Binary Heap) (0) | 2023.01.09 |
hash table / hashing (0) | 2022.11.06 |
λκΈ