Computer Science/Data Structures

πŸ”stack & queue & deque

metamong 2022. 9. 23.

🧜‍♀️stack / queue / deque λͺ¨λ‘ νŠΉμ • μœ„μΉ˜μ—μ„œλ§Œ μ›μ†Œλ₯Ό λ„£κ±°λ‚˜ λΊ„ 수 μžˆλŠ” restricted structure

1. stack

🧜‍♀️ μŠ€νƒμ΄λž€, ν•œ μͺ½μœΌλ‘œλ§Œ 데이터λ₯Ό λΉΌκ³  넣을 수 μžˆλŠ” 자료ꡬ쑰둜, ν•œ μͺ½λ§Œ ꡬ멍이 뚫렀 μžˆλŠ” ν”„λ§κΈ€μŠ€ 톡을 μƒκ°ν•˜λ©΄ λœλ‹€. λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ‚˜μ€‘μ— λ‚˜κ°€λŠ” ν˜•μ‹ - 즉 λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…ν›„μΆœ FILO)의 자료ꡬ쑰. μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λ™μΌν•œ ν˜•νƒœλ‘œ 맀우 κ°„λ‹¨ν•œ 두 μ—°μ‚°(μ›μ†Œ μΆ”κ°€ O(1), μ›μ†Œ 제거 O(1))이 μ œκ³΅λœλ‹€. 제일 μƒλ‹¨μ˜ μ›μ†Œ 확인은 O(1), 제일 상단이 μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인/변경은 μ›μΉ™μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. 항상 μŠ€νƒ μƒλ‹¨μ—λ§Œ 초점이 λ˜μ–΄ 있음. λ”°λΌμ„œ μ‚½μž…ν•  λ•Œμ—λ„ κ°€μž₯ μ΅œκ·Όμ— μ‚½μž…ν•œ μ›μ†Œ λ°”λ‘œ μœ„μ— μ‚½μž…μ΄ 되고, μ‚­μ œν•  λ•Œλ„ κ°€μž₯ μ΅œκ·Όμ— μ‚½μž…ν•œ μ›μ†Œκ°€ μ‚­μ œλœλ‹€. λ”°λΌμ„œ μŠ€νƒμ€ 제일 상단에 μ›μ†Œ μΆ”κ°€ & 제일 상단 μ›μ†Œ 제거 & 제일 상단 μ›μ†Œ 확인 - μ΄λ ‡κ²Œ 3가지 연산이 μ£Όκ°€ λœλ‹€. λ”°λΌμ„œ μŠ€νƒ ν™œμš© λ¬Έμ œλŠ” 제일 상단이 μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인/변경은 ν•„μš” x.

(쒌) Cλ₯Ό 상단에 λ„£κ³  상단에 뺌 / (우) 30을 상단에 λ„£κ³  12λ₯Ό 상단에 λ„£κ³  12λ₯Ό 뺌

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)이며 제일 μ•ž/λ’€κ°€ μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인/변경은 μ›μΉ™μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. μŠ€νƒκ³Ό λ‹€λ₯΄κ²Œ λ‚˜κ°€κ³  λ“€μ–΄μ˜€λŠ” μž…κ΅¬/μΆœκ΅¬κ°€ λ‹€λ₯΄μ§€λ§Œ, 곡톡점은 λͺ¨λ‘ 좜/μž… κ΄€λ ¨ μ—†λŠ” μ›μ†Œλ“€μ˜ 확인/변경은 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 점. 

(쒌) 3 4 5 순 λ¨Όμ € ν•œμͺ½μ— λ“€μ–΄κ°€κ³  λ‚˜μ˜¬ λ•ŒλŠ” 1 2 순 λ‹€λ₯Έμͺ½μ—μ„œ λ‚˜κ°„λ‹€ (우) 30이 ν•œ μͺ½μ— λ“€μ–΄κ°€κ³  λ¨Όμ € λ“€μ–΄κ°€ 있던 26이 λ‹€λ₯Έμͺ½μœΌλ‘œ λ‚˜κ°„λ‹€.

 

🧜‍♀️ 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와 λ‹€λ₯Έ 점은 μ–‘μͺ½ 끝 λͺ¨λ‘μ—μ„œ 자유둭게 λ„£κ³  λΊ„ 수 μžˆλ‹€λŠ” 점. 

(우) μ™Όμͺ½μ—μ„œ 17 μ‚½μž… - 였λ₯Έμͺ½μ—μ„œ 86 제거 - 였λ₯Έμͺ½μ—μ„œ 30 μ‚½μž… - μ™Όμͺ½μ—μ„œ 17 제거

 

β‘  파이썬

🧜‍♀️ 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

λŒ“κΈ€