덱
스택
과 큐
는 모두 덱의 일부라고 할 수 있다.
덱
에서는 양쪽 끝에서 삽입과 삭제 모두 가능하다.
O(1)
시간에 양쪽끝에서 삽입 삭제가 가능하다.
배열로 구현한 덱
#include <iostream>
using namespace std;
const int MX = 1000005;
int dat[2*MX+1];
int head = MX, tail = MX;
void push_front(int x){
dat[--head] = x;
}
void push_back(int x){
dat[tail++] = x;
}
void pop_front(){
head++;
}
void pop_back(){
tail--;
}
int front(){
return dat[head];
}
int back(){
return dat[tail-1];
}
void test(){
push_back(30);
cout << front() << '\n';
cout << back() << '\n';
push_front(25);
push_back(12);
cout << back() << '\n';
push_back(62);
pop_front();
cout << front() << '\n';
pop_front();
cout << back() << '\n';
}
int main(void){
test();
}
배열로 구현한 스택
에서는 앞쪽에서만 삽입 삭제가 일어난다. 또한 배열로 구현한 큐
에서는 앞쪽에서만 삭제, 뒤쪽에서만 삽입이 일어난다.
- 따라서 배열의 크기를
2*MX+1
로 두고, head
와 tail
의 시작 인덱스를 MX
로 두어 양쪽에 나머지 배열의 크기를 MX
로 둘 수 있다.
STL deque
#include <bits/stdc++.h>
using namespace std;
int main(void){
deque<int> DQ;
DQ.push_front(10);
DQ.push_back(50);
DQ.push_front(24);
for(auto x : DQ)cout<<x;
cout << DQ.size() << '\n';
if(DQ.empty()) cout << "DQ is empty\n";
else cout << "DQ is not empty\n";
DQ.pop_front();
DQ.pop_back();
cout << DQ.back() << '\n';
DQ.push_back(72);
cout << DQ.front() << '\n';
DQ.push_back(12);
DQ[2] = 17;
DQ.insert(DQ.begin()+1, 33);
DQ.insert(DQ.begin()+4, 60);
for(auto x : DQ) cout << x << ' ';
cout << '\n';
DQ.erase(DQ.begin()+3);
cout << DQ[3] << '\n';
DQ.clear();
}
STL deque
는 원소들이 연속적으로 구현되어 있지 않다. 따라서 삽입 삭제가 O(1)
시간에 가능하다.
STL vector
는 원소들이 연속적으로 구현되어 있어, 삽입과 삭제에 O(1)
시간이 소모된다.
- 자료의 삽입 삭제가 잦은 상활이라면
STL deque
를 이용하는 게 유리하다.
STL deque
는 insert()
, erase()
함수가 구현되어 있어, 원칙적으로 불가능하지만 원하는 인덱스에 삽입, 삭제가 가능하다.