C ++ deque 대 큐 대 스택


82

대기열과 스택은 널리 언급되는 구조입니다. 그러나 C ++에서는 큐에 대해 두 가지 방법으로 수행 할 수 있습니다.

#include <queue>
#include <deque>

하지만 스택의 경우 다음과 같이 할 수 있습니다.

#include <stack>

내 질문은 대기열과 deque의 차이점이 무엇이며 왜 두 가지 구조가 제안됩니까? 스택의 경우 다른 구조가 포함될 수 있습니까?

답변:


77

Moron / Aryabhatta는 정확하지만 조금 더 자세히 설명하면 도움이 될 수 있습니다.

대기열 및 스택은 deque, vector 또는 list보다 상위 수준의 컨테이너입니다. 즉, 낮은 수준의 컨테이너에서 대기열을 만들거나 스택을 쌓을 수 있습니다.

예를 들면 :

  std::stack<int, std::deque<int> > s;
  std::queue<double, std::list<double> > q;

deque를 기본 컨테이너로 사용하고 목록을 기본 컨테이너로 사용하는 double 큐를 사용하여 int 스택을 빌드합니다.

s제한된 deque 및 q제한된 목록으로 생각할 수 있습니다 .

필요한 것은 하위 수준 컨테이너가 상위 수준 컨테이너에 필요한 메서드를 구현하는 것입니다. 이들은 back(), push_back()그리고 pop_back()스택과 front(), back(), push_back(), 그리고 pop_front()큐.

자세한 내용은 스택대기열 을 참조하십시오 .

데크와 관련하여 양쪽 끝에 삽입 할 수있는 대기열 이상의 역할을합니다. 특히 랜덤 액세스 권한이 있습니다 operator[]. 이것은 벡터와 비슷하지만 시작 부분에 push_front()및로 삽입 및 삭제할 수있는 벡터 pop_front()입니다.

자세한 내용은 deque 를 참조하십시오 .


16
stack그리고 queue 단지 제한 deque 의 전체 된 형상에서.
bobobobo

59

Queue: 한쪽 끝만 삽입하고 다른 쪽 끝은 제거 할 수 있습니다.

Deque: 양쪽 끝에서 삽입 및 제거가 가능합니다.

사용 a 그래서 Deque, 당신은을 모델링 할 수 Queue뿐만 아니라 Stack.

힌트 :
Deque" D ouble e nded que ue"의 줄임말입니다 .


4
Deque를 사용하여 스택을 모델링하면 과도하지 않을까요?
skydoor

대기열로 스택을 모델링 할 수 없습니다.
R Samuel Klatchko 2010

1
훨씬 더 많은 차이점이 있습니다. queue컨테이너의 요구 사항을 충족하지 않습니다. 이터레이터가 없습니다, 제발!
Potatoswatter 2010

@skydoor 모든 표준 라이브러리 컨테이너 중에서 deque는 아마도 오버 헤드가 가장 낮은 컨테이너입니다.

3
@skydoor : 참고로 STL 은 기본적으로를 백업 컨테이너로 std::stack사용합니다 std::deque. 나는 여기에 그 이유를 추측한다 : stackoverflow.com/questions/102459/… (기본적으로 a를 키우는 것은 deque오버 헤드가 적다 는 것 입니다).
Michael Burr

33

deque컨테이너 템플릿입니다. .NET Framework와 매우 유사한 임의 액세스 반복기가있는 시퀀스에 대한 요구 사항을 충족합니다 vector.

queue컨테이너가 아니라 어댑터 입니다. 여기에는 컨테이너가 포함되어 있으며보다 구체적인 다른 인터페이스를 제공합니다. 사용 queue당신은 기억 (또는 생각 나게) 이외의 작업을하지 않도록하려는 경우 push[_back]pop[_front], frontback, sizeempty. queue처음과 마지막을 제외하고 내부의 요소를 전혀 볼 수 없습니다 !


7
어댑터 - 즉은 불필요한 기능 crippler 하지만 어댑터는 잘입니다
bobobobo

22

C ++ 라이브러리에서 std::stack및 둘 다 std::queue컨테이너 어댑터 로 구현됩니다. . 즉, 스택 또는 큐의 인터페이스를 각각 제공하지만 실제로는 컨테이너 자체가 아닙니다. 대신, 그들은 다른 컨테이너 (예를 들어 std::deque또는 std::list실제로 데이터를 저장하기 위해)를 사용하고, std::stack클래스는 번역 push하고 popto push_backand로 pop_back(그리고 std::queue거의 동일하지만 push_backand를 사용 하는) 아주 작은 코드를 가지고 pop_front있습니다.


의 경우 queueVS도 , 및 에 매핑 pop되는 것으로 보이 므로 구현에 따라 다릅니다. pop_frontpushpush_back
chappjc 2015-08-29

@chappjc : 아니요-다시 확인하는 중입니다. pop_front그리고 push_back필요한 것입니다. 죄송합니다.
Jerry Coffin

7

deque는 양쪽 끝에서 쉽게 삽입 / 제거 할 수있는 양면 대기열입니다. 대기열은 한쪽 끝에서만 삽입하고 다른 쪽 끝에서 검색 할 수 있습니다.


5

deque는 후면 및 전면에서 삽입 / 팝을 지원합니다.

대기열은 뒤쪽으로 삽입하고 앞쪽에서 팝만 지원합니다. FIFO (선입 선출)입니다.



0

우선 순위 대기열에서 대기열에서 빼는 순서가 아닌 일부 순서 (우선 순위) 비교에 따라 발생합니다.

예를 들어 가장 빠른 이벤트를 먼저 꺼내고 예정된 시간을 쿼리하여 해당 시점까지 잠을 잘 수 있도록 시간이 지정된 이벤트를 저장할 수 있습니다.

우선 순위 대기열은 종종 힙을 사용하여 구현됩니다.

Mike Anderson 작성 :
https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue


0

In deque (double ended queue) 요소를 뒤쪽에서 삽입하고 뒤로 폼을 제거 할 수 있지만 (스택과 동일), 큐에서는 앞쪽에서만 제거합니다.


이 답변은 주제에 새로운 내용을 추가하지 않습니다 (대부분의 답변은 2010 년의
것임
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.