[C++ 자료 구조와 알고리즘] #5 자료 구조 (5) - std::deque (C++ STL container), std::deque 기반 stack과 queue

Programming/C++ · 2023. 5. 23. 12:03

안녕하세요. C++을 다루기 위한 기본 적인 자료 구조와 코딩 테스트 등에서 응용될 수 있는 알고리즘을 알아보는 시간을 가지겠습니다.

 

이번 게시물은 std::deque를 간단히 설명해 보려 합니다. 

 

게시물 끝에 std::deque를 사용한 stack과 queue 구현 예시도 있으니까 참고 바랍니다!

 

1) 특징

std::deque는 C++ 표준 라이브러리 컨테이너(C++ STL container) 중 하나로, Double-Ended Queue의 약자입니다. deque는 동적으로 크기가 조절되는 Queue 와 비슷한 동작을 제공하면서, 양쪽 끝 모두에서 삽입 및 삭제가 가능한 특징을 가지고 있습니다.

 

이와같은 std::deque에 대한 attributes와 관련 메서드 사용 예시를 알아보겠습니다.

 

2) 코딩 테스트 활용 예시

  • Sliding Window: Sliding Window 알고리즘은 고정된 크기의 윈도우를 슬라이딩 하면서 연속된 부분 배열 또은 부분 시퀀스의 최적 솔루션을 찾는 유형입니다. std::deque는 양 끝 모두에서 데이터를 수정할 수 있기 때문에 유용하게 사용될 수 있습니다.
  • Queue: 큐를 활용하는 문제에서 deque는 큐와 관련된 기본적인 메서드들이 이미 구현되어 있기 때문에 쉽게 활용할 수 있습니다.

 

3) 속성 (Attributes)

std::deque는 <deque> 헤더를 포함해서 사용할 수 있습니다.

 

우선 다음과 같은 std::deque의 주요 속성과 멤버 함수를 통해 해당 자료 구조를 활용하는 방법을 자세하게 알아보겠습니다.

 

  • push_front()
    : 요소를 deque의 맨 앞에 추가합니다. 
  • push_back()
    : 요소를 deque의 맨 뒤에 추가합니다. 
  • pop_front()
    : deque의 맨 앞의 요소를 제거합니다. 
  • pop_back()
    : deque의 맨 뒤의 요소를 제거합니다. 
  • front()
    : deque의 맨 앞의 요소에 대한 참조를 반환합니다. 
  • back()
    : deque의 맨 뒤의 요소에 대한 참조를 반환합니다. 
  • size()
    : deque에 저장된 요소의 개수를 반환합니다. 
  • empty()
    : deque가 비어 있는지 여부를 확인합니다.

 

4) 속성 사용 예시

다음은 std::deque의 속성 사용 예시입니다.

 

  • push_front()
    : 요소를 deque의 맨 앞에 추가합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque;
    
    deque.push_front(1);
    deque.push_front(2);
    deque.push_front(3);
    
    for (const auto& element : deque) {
        std::cout << element << " ";
    }
    
    return 0;
}
  • push_back()
    : 요소를 deque의 맨 뒤에 추가합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque;
    
    deque.push_back(1);
    deque.push_back(2);
    deque.push_back(3);
    
    for (const auto& element : deque) {
        std::cout << element << " ";
    }
    
    return 0;
}
  • pop_front()
    : deque의 맨 앞의 요소를 제거합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque {1, 2, 3};
    
    deque.pop_front();
    
    for (const auto& element : deque) {
        std::cout << element << " ";
    }
    
    return 0;
}
  • pop_back()
    : deque의 맨 뒤의 요소를 제거합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque {1, 2, 3};
    
    deque.pop_back();
    
    for (const auto& element : deque) {
        std::cout << element << " ";
    }
    
    return 0;
}
  • front()
    : deque의 맨 앞의 요소에 대한 참조를 반환합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque {1, 2, 3};
    
    std::cout << deque.front();
    
    return 0;
}
  • back()
    : deque의 맨 뒤의 요소에 대한 참조를 반환합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque {1, 2, 3};
    
    std::cout << deque.back();
    
    return 0;
}
  • size()
    : deque에 저장된 요소의 개수를 반환합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque {1, 2, 3};
    
    std::cout << deque.size();
    
    return 0;
}
  • empty()
    : deque가 비어 있는지 여부를 확인합니다.
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deque;
    
    if (deque.empty()) {
        std::cout << "Deque is empty.";
    } else {
        std::cout << "Deque is not empty.";
    }
    
    return 0;
}

 

5) std::deque를 활용한 stack과 queue 구현 예시

1. Stack 구현 예시

#include <deque>
#include <iostream>

template<typename T>
class Stack {
private:
    std::deque<T> deque;

public:
    void push(const T& value) {
        deque.push_back(value);
    }

    void pop() {
        deque.pop_back();
    }

    T& top() {
        return deque.back();
    }

    bool empty() const {
        return deque.empty();
    }
};

int main() {
    Stack<int> stack;

    stack.push(1);
    stack.push(2);
    stack.push(3);

    while (!stack.empty()) {
        std::cout << stack.top() << " ";
        stack.pop();
    }

    return 0;
}

 

2. Queue 구현 예시

#include <deque>
#include <iostream>

template<typename T>
class Queue {
private:
    std::deque<T> deque;

public:
    void enqueue(const T& value) {
        deque.push_back(value);
    }

    void dequeue() {
        deque.pop_front();
    }

    T& front() {
        return deque.front();
    }

    bool empty() const {
        return deque.empty();
    }
};

int main() {
    Queue<int> queue;

    queue.enqueue(1);
    queue.enqueue(2);
    queue.enqueue(3);

    while (!queue.empty()) {
        std::cout << queue.front() << " ";
        queue.dequeue();
    }

    return 0;
}
 
 
반응형