c ++ deque vs queue vs stack


82

Queue và Stack là một cấu trúc được nhắc đến rộng rãi. Tuy nhiên, trong C ++, đối với hàng đợi, bạn có thể thực hiện theo hai cách:

#include <queue>
#include <deque>

nhưng đối với ngăn xếp, bạn chỉ có thể làm như thế này

#include <stack>

Câu hỏi của tôi là, sự khác biệt giữa hàng đợi và deque, tại sao lại đề xuất hai cấu trúc? Đối với ngăn xếp, bất kỳ cấu trúc nào khác có thể được bao gồm?

Câu trả lời:


77

Moron / Aryabhatta đúng, nhưng chi tiết hơn một chút có thể hữu ích.

Hàng đợi và ngăn xếp là các vùng chứa cấp cao hơn deque, vector hoặc list. Bởi điều này, ý tôi là bạn có thể tạo một hàng đợi hoặc ngăn xếp ra khỏi các vùng chứa cấp thấp hơn.

Ví dụ:

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

Sẽ xây dựng một chồng các int bằng cách sử dụng deque làm vùng chứa bên dưới và một hàng đợi nhân đôi sử dụng danh sách làm vùng chứa bên dưới.

Bạn có thể scoi nó như một deque hạn chế và qnhư một danh sách hạn chế.

Tất cả những gì cần thiết là vùng chứa cấp thấp hơn thực hiện các phương pháp cần thiết của vùng chứa cấp cao hơn. Đây là back(), push_back()pop_back()cho chồng và front(), back(), push_back(), và pop_front()cho hàng đợi.

Xem ngăn xếphàng đợi để biết thêm chi tiết.

Đối với deque, nó không chỉ là một hàng đợi mà bạn có thể chèn ở cả hai đầu. Đặc biệt, nó có quyền truy cập ngẫu nhiên operator[]. Điều này làm cho nó giống như một vectơ, nhưng là một vectơ mà bạn có thể chèn và xóa ở đầu bằng push_front()pop_front().

Xem deque để biết chi tiết.


16
stackqueue chỉ hạn chế deque khỏi bộ tính năng đầy đủ của nó.
bobobobo

59

Queue: bạn chỉ có thể chèn vào một đầu và loại bỏ khỏi đầu kia.

Deque: bạn có thể chèn và gỡ bỏ từ cả hai đầu.

Vì vậy, bằng cách sử dụng a Deque, bạn có thể lập mô hình a Queuecũng như a Stack.

Gợi ý:
Dequelà viết tắt của " D ouble e nded que ue".


4
nó sẽ không quá mức cần thiết nếu bạn sử dụng Deque để lập mô hình ngăn xếp?
skydoor vào

Bạn không thể mô hình hóa một ngăn xếp với một hàng đợi.
R Samuel Klatchko

1
Có rất nhiều sự khác biệt. queuekhông đáp ứng các yêu cầu của một container. Nó không có trình lặp, vì Chúa!
Potatoswatter

@skydoor Trong tất cả các bộ chứa thư viện tiêu chuẩn, bộ chứa thư viện được cho là bộ chứa có chi phí thấp nhất.

3
@skydoor: Cũng như một FYI, STL std::stacksử dụng a std::dequelàm vùng chứa sao lưu theo mặc định. Tôi suy đoán lý do ở đây: stackoverflow.com/questions/102459/… (về cơ bản, việc phát triển a dequelà chi phí thấp).
Michael Burr

33

dequelà một mẫu vùng chứa. Nó đáp ứng các yêu cầu cho một trình tự với các trình vòng lặp truy cập ngẫu nhiên, giống như a vector.

queuehoàn toàn không phải là một thùng chứa, nó là một bộ chuyển đổi . Nó chứa một vùng chứa và cung cấp một giao diện khác, cụ thể hơn. Sử dụng queuekhi bạn muốn ghi nhớ (hoặc nhắc nhở) để tránh các thao tác bên cạnh push[_back]pop[_front], frontback, sizeempty. Bạn không thể nhìn vào các phần tử bên trong bên queuengoài phần đầu tiên và phần cuối cùng!


7
Adaptor - nói cách khác không cần thiết chức năng Crippler , nhưng bộ chuyển đổi là tốt
bobobobo

22

Trong thư viện C ++, cả hai std::stackstd::queueđược triển khai dưới dạng bộ điều hợp vùng chứa . Điều đó có nghĩa là chúng cung cấp giao diện của một ngăn xếp hoặc một hàng đợi tương ứng, nhưng bản thân nó không thực sự là một vùng chứa. Thay vào đó, chúng sử dụng một số vùng chứa khác (ví dụ std::dequehoặc std::listthực sự lưu trữ dữ liệu) và std::stacklớp chỉ có một đoạn mã nhỏ để dịch pushpopsang push_backpop_back(và std::queuethực hiện gần giống, nhưng sử dụng push_backpop_front).


Đối với a queue, VS dường như cũng ánh xạ poptới pop_frontpushtới push_back, vì vậy tôi đoán điều này phụ thuộc vào việc triển khai.
chappjc

@chappjc: Không - kiểm tra lại, chỉ là bộ nhớ của tôi đã tắt. pop_frontpush_backlà những gì được yêu cầu. Lời xin lỗi của tôi.
Jerry Coffin,

7

Deque là một hàng đợi hai đầu, cho phép dễ dàng chèn / xóa từ hai đầu. Hàng đợi chỉ cho phép chèn ở một đầu và truy xuất từ ​​đầu kia.


5

deque hỗ trợ chèn / bật từ phía sau và phía trước

queue chỉ hỗ trợ chèn ra phía sau và bật ra từ phía trước. Bạn biết đấy, một FIFO (nhập trước xuất trước).



0

Việc xếp hàng đợi ưu tiên xảy ra theo một số so sánh thứ tự (ưu tiên) không phải thứ tự xếp hàng.

Ví dụ: bạn có thể lưu trữ các sự kiện được hẹn giờ ở một nơi mà bạn muốn lấy ra sự kiện sớm nhất trước và truy vấn thời gian đã lên lịch của nó để bạn có thể ngủ cho đến thời điểm đó.

Hàng đợi ưu tiên thường được triển khai bằng cách sử dụng heap.

của Mike Anderson tại đây:
https://www.quora.com/What-is-the-difference-between-a-priosystem-queue-and-a-queue


0

Trong deque (hàng đợi kết thúc kép) Phần tử có thể được chèn từ phía sau và loại bỏ biểu mẫu trở lại (Giống như ngăn xếp), Nhưng trong hàng đợi chỉ loại bỏ từ phía trước.


Câu trả lời này không thêm bất cứ điều gì mới vào chủ đề (và hầu hết các câu trả lời là từ năm 2010)
barbsan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.