Cài 9t danh sách liên s7 dụng con trU

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (Trang 56)

5. Danh sách liên kết – Linked list

5.3.Cài 9t danh sách liên s7 dụng con trU

• pop() ñược thực hiện không hiệu quả tất cả các phần tử ñều sẽ bị dồn về ñầu

mảng do ñó ñộ phức tạp là O(n).

Làm thế nào chúng ta có thể cải thiện tình hình này?

Thay vì chỉ sử dụng một biến chỉ số tail chúng ta sử dụng hai biến tail và head, khi cần loại bỏ (pop) một phần tử khỏi hàng ñợi chúng ta sẽ tăng biến head lên 1

Tuy vậy vẫn còn có vấn ñề, ñó là sau n lần push() (n là kích thước mảng) mảng sẽ ñầy kể cả trong trường hợp nó gần như rỗng về mặt logic. Để giải quyết vấn ñề này chúng ta sẽ sử dụng lại các phần tửở ñầu mảng. Khi push() một phần tử mới tail sẽ ñược tăng lên 1 nhưng nếu như nó ở cuối mảng thì sẽñặt nó bằng .

Vấn ñề mới nảy sinh ở ñây là làm thế nào chúng ta có thể xác ñịnh ñược khi nào hàng ñợi rỗng hoặc ñầy?

Cách giải quyết ñơn giản là ta sẽ dùng một biến lưu số phần tử thực sự của hàng ñợi

ñể giải quyết cho tất cả các thao tác kiểm tra hàng ñợi rỗng, ñầy hoặc lấy số phần tử của hàng ñợi.

clude <stdio.h> clude <stdlib.h>

const int MA ELEMENT // so phan tu toi da cua queue la

// khai bao queue chua cac so nguyen typedef struct

{

int data // khai bao mang dong int head

int tail

int cap // luu so phan tu cua hang doi } queue

// ham khoi tao queue rong void init(queue )

void push(queue s, int d)

void pop(queue )

int front(const queue ) int back(const queue ) int size(const queue ) int empty(const queue ) int full(const queue )

// ham giai phong bo nho danh cho queue void clear(queue )

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (Trang 56)