Seung's Learning Record

Restricted Structure_Deque(덱) 본문

알고리즘

Restricted Structure_Deque(덱)

70_0ewd 2023. 11. 7. 14:24
 

Deque 이란?

Restricted sturcture의 끝판왕인 덱은 양쪽 끝에서 삽입과 삭제가 모두 가능하다.

Deque 성질

  • 원소의 추가 O(1)
  • 원소의 제거 O(1)
  • 최상단의 원소 확인 O(1)
  • 최상단의 원소를 제외한 나머지 원소들은 확인 및 변경은 원칙적으로 불가능 하지만 STL을 통해 인덱스에 접근이 가능하다.

Deque 구현 

덱의 구현 방법에는 배열을 사용하여 구현하는 방법과 STL을 사용하는 방법이 있다.

배열을 사용한 구현

const int MX = 1000000;
int dat[2*MX+1];
int head = MX, tail = MX;

void push_front(int x){
    dat[head]=x;
    head--;
}

void push_back(int x){
    dat[tail]=x;
    tail++;
}

void pop_front(){
    head++;
}

void pop_back(){
    tail--;
}

int front(){
    return dat[head];
}

int back(){
    return dat[tail-1];
}
  • dat[2*MX+1] : head와 tail의 초기값 설정을 위해 크기를 저렇게 설정
  • head, tail : 덱의 가장 앞/뒤 값. 덱은 큐와 다르게 양쪽에서 삽입/삭제가 가능해서 0번지를 초기값으로 잡게 될 경우, 삽입 삭제에 문제가 생기게 된다. 이 때문에 head,tail값을 배열의 중간값으로 설정해야한다. tail은 큐와 동일하게 맨 뒤 인덱스의 다음 위치를 가르킨다.

STL을 사용한 구현

#include <deque> 헤더파일을 포함해야 한다.

#include <iostream>
#include <deque>
using namespace std;

int main(void){
  deque<int> DQ;
  DQ.push_front(10); // 10
  DQ.push_back(50); // 10 50
  DQ.push_front(24); // 24 10 50
  
  cout << DQ.size() << '\n'; // 3
  
  if(DQ.empty()) 
  	cout << "DQ is empty\n";
  else 
  	cout << "DQ is not empty\n"; // DQ is not empty
    
  DQ.pop_front(); // 10 50
  DQ.pop_back(); // 10
  cout << DQ.back() << '\n'; // 10
  
  DQ.push_back(72); // 10 72
  cout << DQ.front() << '\n'; // 10
  DQ.push_back(12); // 10 72 12
  
  DQ[2] = 17; // 10 72 17
  DQ.insert(DQ.begin()+1, 33); // 10 33 72 17
  DQ.insert(DQ.begin()+4, 60); // 10 33 72 17 60
  
  for(auto x : DQ) 
  	cout << x << ' ';
  cout << '\n';
  
  DQ.erase(DQ.begin()+3); // 10 33 72 60
  cout << DQ[3] << '\n'; // 60
  DQ.clear(); // DQ의 모든 원소 제거
}

위에서도 언급했듯이 STL덱은 인덱스의 중간값에 접근이 가능하다. 사용법을 보면 que보다는 오히려 벡터에 가까운 모습임을 알 수 있다. 벡터와 다르게 덱은 원소들이 메모리 상에 떨어진 상태로 배치되어있다.

 

 

 

출처:https://www.youtube.com/watch?v=0mEzJ4S1d8o&list=PLtqbFd2VIQv4O6D6l9HcD732hdrnYb6CY&index=8

'알고리즘' 카테고리의 다른 글

깊이 우선 탐색 / DFS  (0) 2023.11.11
너비 우선 탐색 / BFS  (1) 2023.11.09
Restricted Structure_Queue(큐)  (0) 2023.11.07
Restricted Structure_STACK(스택)  (0) 2023.11.05
연결 리스트/Linked list  (1) 2023.11.02