sự khác biệt cơ bản giữa ngăn xếp và hàng đợi là gì?


130

Sự khác biệt cơ bản giữa ngăn xếp và hàng đợi là gì ??

Xin hãy giúp tôi tôi không thể tìm thấy sự khác biệt.

Làm thế nào để bạn phân biệt một ngăn xếp và một hàng đợi?

Tôi đã tìm kiếm câu trả lời trong các liên kết khác nhau và tìm thấy câu trả lời này ..

Trong lập trình cấp cao,

một ngăn xếp được định nghĩa là một danh sách hoặc chuỗi các phần tử được kéo dài bằng cách đặt các phần tử mới "lên trên" các phần tử hiện có và rút ngắn bằng cách loại bỏ các phần tử khỏi phần tử hiện có. Nó là một [Kiểu dữ liệu trừu tượng] với các phép toán "đẩy" và "bật".

Hàng đợi là một chuỗi các yếu tố được thêm vào bằng cách đặt phần tử mới ở phía sau của phần tử hiện có và rút ngắn bằng cách loại bỏ các phần tử ở phía trước hàng đợi. Nó là một ADT [Kiểu dữ liệu trừu tượng]. Có nhiều hơn những thuật ngữ này được hiểu trong lập trình Java, C ++, Python, v.v.

Tôi có thể có một câu trả lời chi tiết hơn không? Làm ơn giúp tôi.


12
Dường như bạn đã trả lời câu hỏi của riêng mình - một ngăn xếp là thùng chứa Đầu tiên vào trước (LIFO) và hàng đợi là một thùng chứa Đầu tiên vào trước (FIFO).
Iridium

Câu trả lời:


151

Stack là cấu trúc dữ liệu LIFO (cuối cùng xuất hiện trước). Liên kết liên kết đến wikipedia chứa mô tả chi tiết và ví dụ.

Hàng đợi là một cấu trúc dữ liệu FIFO (đầu tiên vào trước ra trước). Liên kết liên kết đến wikipedia chứa mô tả chi tiết và ví dụ.


131

Hãy tưởng tượng một chồng giấy . Mảnh cuối cùng được đặt vào ngăn xếp nằm trên cùng, vì vậy nó là mảnh đầu tiên được đưa ra. Đây là LIFO . Thêm một mảnh giấy được gọi là "đẩy" và loại bỏ một mảnh giấy được gọi là "popping".

Hãy tưởng tượng một hàng đợi tại cửa hàng . Người đầu tiên trong hàng là người đầu tiên ra khỏi dòng. Đây là FIFO . Một người được xếp hàng là "mê hoặc", và một người ra khỏi dòng là "mất trí".


3
Một trong những tương tự tốt nhất tôi có thể nghĩ đến.
Yeikel

83

Một mô hình trực quan

Pancake Ngăn xếp (LIFO)

Cách duy nhất để thêm một và / hoặc loại bỏ một là từ đầu.

bánh kếp

Dòng Queue (FIFO)

Khi một người đến họ đến cuối hàng đợi và khi một người rời đi, họ rời khỏi phía trước hàng đợi.

dòng dmv

Sự thật thú vị: người Anh coi hàng người là hàng đợi


6
Jee, đây phải là câu trả lời imo. Cảm ơn @Jacksonkr
Kicesangar

Haha chắc chắn đây là một mô tả hoàn hảo về Queue và Stack, nhưng chỉ để tranh luận, nếu tôi muốn chiếc bánh đầu tiên được thêm vào đĩa thì sao? Tôi biết điều này có thể được hoàn thành với stack.size () so với if (! Stack.isEmpty ()), nhưng vẫn là chiếc bánh đầu tiên có thể là thứ tốt nhất :) ... Dù sao đi nữa, câu trả lời hay và tôi đồng ý đây là rõ ràng nhất ... có vẻ thú vị khi người Anh gọi các dòng là Hàng đợi mặc dù (nếu đó là chính xác), trong ngôn ngữ không lập trình, tôi vẫn sẽ xem xét một dòng nơi mục nhập đầu tiên được rời khỏi trước (sau khi thoát khỏi dòng / hàng )
ViaTech

Đợi đã, họ không được gọi là hàng đợi ở nơi khác?
ghen tị

37

Bạn có thể nghĩ cả hai như một danh sách các thứ được sắp xếp (được sắp xếp theo thời gian mà chúng được thêm vào danh sách). Sự khác biệt chính giữa hai là cách các phần tử mới vào danh sách và các phần tử cũ rời khỏi danh sách.

Đối với một ngăn xếp, nếu tôi có một danh sách a, b, cvà tôi thêm vào d, nó sẽ được xử lý ở cuối, vì vậy tôi kết thúc với a,b,c,d. Nếu tôi muốn bật một phần tử của danh sách, tôi sẽ xóa phần tử cuối cùng mà tôi đã thêm d. Sau một pop, danh sách của tôi bây giờ là a,b,cmột lần nữa

Đối với một hàng đợi, tôi thêm các yếu tố mới theo cùng một cách. a,b,ctrở thành a,b,c,dsau khi thêm d. Nhưng, bây giờ khi tôi bật, tôi phải lấy một yếu tố từ phía trước danh sách, để nó trở thành b,c,d.

Nó rất đơn giản!


14

Xếp hàng

Queue là một bộ sưu tập các mặt hàng.

Các mục bị xóa ở một đầu được gọi là 'phía trước' của hàng đợi.

Các mục được chèn ở đầu kia gọi là 'phía sau' của hàng đợi.

Mục đầu tiên được chèn là mục đầu tiên được xóa (FIFO).

Cây rơm

Stack là một bộ sưu tập các mặt hàng.

Nó cho phép truy cập chỉ một mục dữ liệu: mục cuối cùng được chèn.

Các mục được chèn và xóa ở một đầu được gọi là 'Top of stack'.

Nó là một đối tượng năng động và liên tục thay đổi.

Tất cả các mục dữ liệu được đặt lên trên cùng của ngăn xếp và lấy ra khỏi đầu

Cấu trúc truy cập này được gọi là cấu trúc Last in First out (LIFO)


Vì vậy, về cơ bản, một 'hàng đợi' là một "FIFO" - đầu tiên trong hàng đợi ra đầu tiên. Trong khi một 'ngăn xếp' là "LIFO" - cuối cùng trong hàng đợi ra đầu tiên. Tôi có đúng không?
Sebastian Nielsen

@SebastianNielsen Có đúng như đã đề cập trong câu trả lời.
Dissanayake

Nhưng sự khác biệt giữa danh sách liên kết và ngăn xếp là gì? Nó không giống nhau sao?
Sebastian Nielsen

@SebastianNielsen Ngăn xếp là một ADT, có nghĩa là nó hiển thị một giao diện, đó là hoạt động đẩy và bật, nhưng cơ chế cơ bản (thực hiện) bị ẩn khỏi người dùng cuối. Một ngăn xếp có thể được thực hiện với một mảng hoặc với một danh sách được liên kết.
viêm gdyrrah

13

CÂY RƠM:

  1. Ngăn xếp được định nghĩa là một danh sách các phần tử trong đó chúng ta chỉ có thể chèn hoặc xóa các phần tử ở đầu ngăn xếp.
  2. Hành vi của ngăn xếp giống như hệ thống nhập trước xuất trước (LIFO).
  3. Stack được sử dụng để truyền tham số giữa các chức năng. Trong một cuộc gọi đến một hàm, các tham số và biến cục bộ được lưu trữ trên một ngăn xếp.
  4. Các ngôn ngữ lập trình cấp cao như Pascal, c, v.v. cung cấp hỗ trợ cho đệ quy sử dụng ngăn xếp để ghi sổ. Hãy nhớ trong mỗi cuộc gọi đệ quy, cần phải lưu giá trị hiện tại của các tham số, biến cục bộ và địa chỉ trả về (địa chỉ mà điều khiển phải trả về sau cuộc gọi).

XẾP HÀNG:

  1. Hàng đợi là một tập hợp của cùng một loại phần tử. Đó là một danh sách tuyến tính trong đó việc chèn vào có thể diễn ra ở một đầu của danh sách, được gọi là phía sau danh sách và việc xóa chỉ có thể diễn ra ở đầu kia, được gọi là phía trước danh sách
  2. Hành vi của một hàng đợi giống như một hệ thống nhập trước xuất trước (FIFO).

Tôi khá chắc chắn rằng bạn cũng có thể chèn vào cuối hoặc bắt đầu một ngăn xếp, tôi nghĩ rằng điều quan trọng cần lưu ý ở đây là FIFO so với LIFO
Mike

6

Một ngăn xếp là một tập hợp các phần tử, có thể được lưu trữ và truy xuất từng phần một. Các phần tử được truy xuất theo thứ tự ngược thời gian lưu trữ của chúng, tức là phần tử mới nhất được lưu trữ là phần tử tiếp theo được truy xuất. Một ngăn xếp đôi khi được gọi là cấu trúc Lần đầu vào trước (LIFO) hoặc Lần đầu tiên vào trước (FILO). Các phần tử được lưu trữ trước đó không thể được truy xuất cho đến khi phần tử mới nhất (thường được gọi là phần tử 'trên cùng') đã được truy xuất.

Hàng đợi là một tập hợp các phần tử, có thể được lưu trữ và truy xuất từng phần một. Các phần tử được truy xuất theo thứ tự thời gian lưu trữ của chúng, tức là phần tử đầu tiên được lưu trữ là phần tử tiếp theo được truy xuất. Một hàng đợi đôi khi được gọi là cấu trúc First-In-First-Out (FIFO) hoặc Last-In-Last-Out (LILO). Các phần tử được lưu trữ sau đó không thể được truy xuất cho đến khi phần tử đầu tiên (thường được gọi là phần tử 'phía trước') đã được truy xuất.


2

STACK: Stack được định nghĩa là một danh sách các phần tử trong đó chúng ta chỉ có thể chèn hoặc xóa các phần tử ở đầu ngăn xếp

Stack được sử dụng để truyền tham số giữa các chức năng. Trong một cuộc gọi đến một hàm, các tham số và biến cục bộ được lưu trữ trên một ngăn xếp.

Một ngăn xếp là một tập hợp các phần tử, có thể được lưu trữ và truy xuất từng phần một. Các phần tử được truy xuất theo thứ tự ngược thời gian lưu trữ của chúng, tức là phần tử mới nhất được lưu trữ là phần tử tiếp theo được truy xuất. Một ngăn xếp đôi khi được gọi là cấu trúc Lần đầu vào trước (LIFO) hoặc Lần đầu tiên vào trước (FILO). Các phần tử được lưu trữ trước đó không thể được truy xuất cho đến khi phần tử mới nhất (thường được gọi là phần tử 'trên cùng') đã được truy xuất.

XẾP HÀNG:

Hàng đợi là một tập hợp của cùng một loại phần tử. Đó là một danh sách tuyến tính trong đó việc chèn vào có thể diễn ra ở một đầu của danh sách, được gọi là phía sau danh sách và việc xóa chỉ có thể diễn ra ở đầu kia, được gọi là phía trước danh sách

Hàng đợi là một tập hợp các phần tử, có thể được lưu trữ và truy xuất từng phần một. Các phần tử được truy xuất theo thứ tự thời gian lưu trữ của chúng, tức là phần tử đầu tiên được lưu trữ là phần tử tiếp theo được truy xuất. Một hàng đợi đôi khi được gọi là cấu trúc First-In-First-Out (FIFO) hoặc Last-In-Last-Out (LILO). Các phần tử được lưu trữ sau đó không thể được truy xuất cho đến khi phần tử đầu tiên (thường được gọi là phần tử 'phía trước') đã được truy xuất.


2

Để thử và đơn giản hóa quá mức mô tả của ngăn xếp và hàng đợi, chúng đều là các chuỗi yếu tố thông tin động có thể được truy cập từ một đầu của chuỗi và sự khác biệt thực sự duy nhất giữa chúng là:

khi làm việc với một ngăn xếp

  • bạn chèn các phần tử ở một đầu của chuỗi và
  • bạn truy xuất và / hoặc loại bỏ các phần tử từ cùng một chuỗi

trong khi với một hàng đợi

  • bạn chèn các phần tử ở một đầu của chuỗi và
  • bạn lấy / xóa chúng từ đầu kia

LƯU Ý : Tôi đang sử dụng từ ngữ trừu tượng của truy xuất / xóa trong ngữ cảnh này bởi vì có những trường hợp khi bạn chỉ lấy phần tử từ chuỗi hoặc theo nghĩa là chỉ đọc nó hoặc truy cập giá trị của nó, nhưng cũng có trường hợp khi bạn loại bỏ phần tử khỏi chuỗi và cuối cùng có những trường hợp khi bạn thực hiện cả hai hành động với cùng một cuộc gọi.

Ngoài ra, phần tử từ được sử dụng có chủ đích để trừu tượng chuỗi tưởng tượng càng nhiều càng tốt và tách nó ra khỏi các thuật ngữ ngôn ngữ lập trình cụ thể. Thực thể thông tin trừu tượng này được gọi là phần tử có thể là bất cứ thứ gì, từ một con trỏ, một giá trị, một chuỗi hoặc các ký tự, một đối tượng, ... tùy thuộc vào ngôn ngữ.

Trong hầu hết các trường hợp, mặc dù nó thực sự là một giá trị hoặc một vị trí bộ nhớ (tức là một con trỏ). Và phần còn lại chỉ che giấu sự thật này đằng sau biệt ngữ ngôn ngữ <

Một hàng đợi có thể hữu ích khi thứ tự của các yếu tố là quan trọng và cần phải chính xác giống như khi các yếu tố lần đầu tiên xuất hiện trong chương trình của bạn. Chẳng hạn, khi bạn xử lý luồng âm thanh hoặc khi bạn đệm dữ liệu mạng. Hoặc khi bạn làm bất kỳ loại cửa hàng và chuyển tiếp xử lý. Trong tất cả các trường hợp này, bạn cần chuỗi các phần tử được xuất theo thứ tự giống như chúng được đưa vào chương trình của bạn, nếu không thông tin có thể ngừng có ý nghĩa. Vì vậy, bạn có thể ngắt chương trình của mình trong một phần đọc dữ liệu từ một số đầu vào, thực hiện một số xử lý và ghi chúng vào hàng đợi và một phần lấy dữ liệu từ hàng đợi xử lý chúng và lưu trữ chúng trong hàng đợi khác để xử lý hoặc truyền dữ liệu .

Một ngăn xếp có thể hữu ích khi bạn cần lưu trữ tạm thời một phần tử sẽ được sử dụng trong (các) bước ngay lập tức của chương trình của bạn. Chẳng hạn, các ngôn ngữ lập trình thường sử dụng cấu trúc ngăn xếp để truyền các biến cho các hàm. Những gì họ thực sự làm là lưu trữ (hoặc đẩy) các đối số hàm trong ngăn xếp và sau đó nhảy đến hàm nơi chúng loại bỏ và truy xuất (hoặc bật) cùng số lượng phần tử từ ngăn xếp. Bằng cách đó, kích thước của ngăn xếp phụ thuộc vào số lượng các lệnh gọi lồng nhau của các hàm. Ngoài ra, sau khi một chức năng đã được gọi và hoàn thành những gì nó đang làm, nó rời khỏi ngăn xếp trong điều kiện chính xác như trước khi nó được gọi! Bằng cách đó, bất kỳ chức năng nào cũng có thể hoạt động với ngăn xếp bỏ qua cách các chức năng khác hoạt động với nó.

Cuối cùng, bạn nên biết rằng có những thuật ngữ khác được sử dụng ngoài kia cho cùng một khái niệm tương tự. Ví dụ, một ngăn xếp có thể được gọi là một đống. Ngoài ra còn có các phiên bản lai của các khái niệm này, ví dụ, hàng đợi hai đầu có thể hoạt động cùng lúc với một ngăn xếp và như một hàng đợi, bởi vì cả hai đầu có thể được truy cập cùng lúc. Ngoài ra, thực tế là cấu trúc dữ liệu được cung cấp cho bạn dưới dạng ngăn xếp hoặc hàng đợi, điều đó không nhất thiết có nghĩa là nó được triển khai như vậy, có những trường hợp trong đó cấu trúc dữ liệu có thể được triển khai như bất kỳ thứ gì và được cung cấp cụ thể cấu trúc dữ liệu đơn giản vì nó có thể được thực hiện để hành xử như vậy. Nói cách khác, nếu bạn cung cấp phương thức đẩy và bật cho bất kỳ cấu trúc dữ liệu nào, chúng sẽ trở thành ngăn xếp một cách kỳ diệu!


Không sử dụng định dạng mã cho văn bản không phải là mã.
Hầu tước Lorne

1

STACK là danh sách LIFO (cuối cùng vào trước ra trước). có nghĩa là giả sử 3 phần tử được chèn vào stack tức là 10,20,30. 10 được chèn trước & 30 được chèn cuối cùng vì vậy 30 được xóa đầu tiên khỏi stack & 10 được xóa lần cuối khỏi stack. Đây là danh sách LIFO (Last In First Out).

QUEUE là danh sách FIFO (First In First Out). Có nghĩa là một phần tử được chèn trước tiên sẽ bị xóa đầu tiên. Hàng đợi của mọi người.


1

Ngăn xếp được coi là một bộ sưu tập dọc. Trước tiên hãy hiểu rằng một bộ sưu tập là một ĐỐI TƯỢNG tập hợp và tổ chức các ĐỐI TƯỢNG nhỏ hơn khác. Các đối tượng nhỏ hơn này thường được gọi là các yếu tố. Các phần tử này được "Đẩy" trên ngăn xếp theo thứ tự ABC trong đó A là đầu tiên và C là cuối cùng. theo chiều dọc nó sẽ trông như thế này: Đã thêm phần tử thứ 3) C Phần tử thứ 2 được thêm vào) B Phần tử thứ 1 được thêm vào) A

Lưu ý rằng "A" lần đầu tiên được thêm vào ngăn xếp nằm ở phía dưới. Nếu bạn muốn xóa "A" khỏi ngăn xếp, trước tiên bạn phải xóa "C", sau đó "B", và cuối cùng là phần tử mục tiêu của bạn "A". Ngăn xếp yêu cầu một cách tiếp cận LIFO trong khi xử lý sự phức tạp của ngăn xếp (Lần đầu tiên xuất hiện) Khi xóa một phần tử khỏi ngăn xếp, cú pháp đúng là pop. chúng tôi không xóa phần tử khỏi ngăn xếp mà chúng tôi "bật" nó ra.

Hãy nhớ lại rằng "A" là phần tử đầu tiên được đẩy vào ngăn xếp và "C" là mục cuối cùng được đẩy trên ngăn xếp. Nếu bạn quyết định rằng bạn muốn xem những gì ở dưới cùng của ngăn xếp, là 3 phần tử trên ngăn xếp đã ra lệnh A là B đầu tiên là phần tử thứ hai và C là phần tử thứ ba, phần trên sẽ phải được bật ra sau đó phần tử thứ hai được thêm vào để xem phần dưới cùng của ngăn xếp.


Vui lòng định dạng câu hỏi của bạn để làm cho nó trông tốt hơn và dễ đọc hơn.
Neeku
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.