Cấu trúc dữ liệu và thuật toán - Hàng đợi

Queue là một cấu trúc dữ liệu trừu tượng, hơi giống với Stacks. Không giống như ngăn xếp, hàng đợi được mở ở cả hai đầu của nó. Một đầu luôn dùng để chèn dữ liệu (enqueue) và đầu kia dùng để xóa dữ liệu (dequeue). Queue tuân theo phương pháp First-In-First-Out, tức là mục dữ liệu được lưu trước sẽ được truy cập trước.

Một ví dụ thực tế về hàng đợi có thể là đường một chiều có một làn xe, nơi xe đi vào trước, ra trước. Có thể thấy nhiều ví dụ thực tế hơn như xếp hàng ở cửa sổ soát vé và trạm dừng xe buýt.

Trình bày hàng đợi

Như bây giờ chúng ta hiểu rằng trong hàng đợi, chúng ta truy cập cả hai đầu vì những lý do khác nhau. Sơ đồ sau được đưa ra dưới đây cố gắng giải thích biểu diễn hàng đợi dưới dạng cấu trúc dữ liệu:

Như trong ngăn xếp, hàng đợi cũng có thể được triển khai bằng Mảng, Danh sách liên kết, Con trỏ và Cấu trúc. Để đơn giản, chúng ta sẽ triển khai các hàng đợi bằng cách sử dụng mảng một chiều.

Hoạt động cơ bản

Các hoạt động hàng đợi có thể liên quan đến việc khởi tạo hoặc xác định hàng đợi, sử dụng nó, và sau đó xóa hoàn toàn nó khỏi bộ nhớ. Ở đây chúng tôi sẽ cố gắng hiểu các hoạt động cơ bản liên quan đến hàng đợi -

  • enqueue() - thêm (lưu trữ) một mục vào hàng đợi.

  • dequeue() - xóa (truy cập) một mục khỏi hàng đợi.

Cần thêm một số chức năng để làm cho hoạt động hàng đợi nói trên hiệu quả. Đây là -

  • peek() - Lấy phần tử ở phía trước hàng đợi mà không cần xóa nó.

  • isfull() - Kiểm tra xem hàng đợi đã đầy chưa.

  • isempty() - Kiểm tra xem hàng đợi có trống không.

Trong hàng đợi, chúng tôi luôn xếp hàng (hoặc truy cập) dữ liệu, được trỏ bởi front con trỏ và trong khi đánh dấu (hoặc lưu trữ) dữ liệu trong hàng đợi, chúng tôi sẽ trợ giúp rear con trỏ.

Đầu tiên chúng ta hãy tìm hiểu về các chức năng hỗ trợ của hàng đợi -

nhìn trộm ()

Chức năng này giúp xem dữ liệu tại frontcủa hàng đợi. Thuật toán của hàm peek () như sau:

Algorithm

begin procedure peek
   return queue[front]
end procedure

Thực hiện hàm peek () trong ngôn ngữ lập trình C -

Example

int peek() {
   return queue[front];
}

isfull ()

Vì chúng tôi đang sử dụng mảng một chiều để triển khai hàng đợi, chúng tôi chỉ cần kiểm tra xem con trỏ phía sau có đạt đến MAXSIZE hay không để xác định rằng hàng đợi đã đầy. Trong trường hợp chúng tôi duy trì hàng đợi trong một danh sách liên kết vòng tròn, thuật toán sẽ khác. Thuật toán của hàm isfull () -

Algorithm

begin procedure isfull

   if rear equals to MAXSIZE
      return true
   else
      return false
   endif
   
end procedure

Thực hiện hàm isfull () trong ngôn ngữ lập trình C.

Example

bool isfull() {
   if(rear == MAXSIZE - 1)
      return true;
   else
      return false;
}

isempty ()

Thuật toán của hàm isempty () -

Algorithm

begin procedure isempty

   if front is less than MIN  OR front is greater than rear
      return true
   else
      return false
   endif
   
end procedure

Nếu giá trị của front nhỏ hơn MIN hoặc 0, nó cho biết rằng hàng đợi chưa được khởi tạo, do đó trống.

Đây là mã lập trình C -

Example

bool isempty() {
   if(front < 0 || front > rear) 
      return true;
   else
      return false;
}

Hoạt động Enqueue

Hàng đợi duy trì hai con trỏ dữ liệu, frontrear. Do đó, các hoạt động của nó tương đối khó thực hiện hơn so với hoạt động của ngăn xếp.

Các bước sau nên được thực hiện để xếp (chèn) dữ liệu vào hàng đợi:

  • Step 1 - Kiểm tra xem hàng đợi đã đầy chưa.

  • Step 2 - Nếu hàng đợi đầy, tạo ra lỗi tràn và thoát.

  • Step 3 - Nếu hàng đợi không đầy, tăng rear con trỏ để trỏ đến không gian trống tiếp theo.

  • Step 4 - Thêm phần tử dữ liệu vào vị trí hàng đợi, nơi mà phía sau đang trỏ tới.

  • Step 5 - trả lại thành công.

Đôi khi, chúng tôi cũng kiểm tra xem một hàng đợi có được khởi tạo hay không, để xử lý mọi tình huống không lường trước được.

Thuật toán cho hoạt động hàng đợi

procedure enqueue(data)      
   
   if queue is full
      return overflow
   endif
   
   rear ← rear + 1
   queue[rear] ← data
   return true
   
end procedure

Triển khai enqueue () trong ngôn ngữ lập trình C -

Example

int enqueue(int data)      
   if(isfull())
      return 0;
   
   rear = rear + 1;
   queue[rear] = data;
   
   return 1;
end procedure

Hoạt động Dequeue

Truy cập dữ liệu từ hàng đợi là một quá trình gồm hai nhiệm vụ - truy cập dữ liệu ở đâu frontlà trỏ và xóa dữ liệu sau khi truy cập. Các bước sau được thực hiện để thực hiệndequeue hoạt động -

  • Step 1 - Kiểm tra xem hàng đợi có trống không.

  • Step 2 - Nếu hàng đợi trống, tạo ra lỗi dòng dưới và thoát.

  • Step 3 - Nếu hàng đợi không trống, hãy truy cập dữ liệu ở đâu front đang trỏ.

  • Step 4 - Gia tăng front con trỏ để trỏ đến phần tử dữ liệu có sẵn tiếp theo.

  • Step 5 - Trả lại thành công.

Thuật toán cho hoạt động dequeue

procedure dequeue
   
   if queue is empty
      return underflow
   end if

   data = queue[front]
   front ← front + 1
   return true

end procedure

Thực hiện dequeue () trong ngôn ngữ lập trình C -

Example

int dequeue() {
   if(isempty())
      return 0;

   int data = queue[front];
   front = front + 1;

   return data;
}

Để có chương trình Queue hoàn chỉnh bằng ngôn ngữ lập trình C, vui lòng nhấp vào đây .