30
CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI

CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

  • Upload
    vokien

  • View
    224

  • Download
    4

Embed Size (px)

Citation preview

Page 1: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

CẤU TRÚC DỮ LIỆU& GIẢI THUẬT 1

NGĂN XẾP & HÀNG ĐỢI

Page 2: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Stack• Ngăn xếp là một danh sách đặc biệt mà

trong đó việc thêm vào hoặc loại bỏ mộtphần tử chỉ thực hiện tại một đầu củadanh sách, đầu này gọi là đỉnh (TOP) củadanh sách.

• Dữ liệu được thêm vào sau sẽ lấy ra trướctheo nguyên tắc LIFO (Last In First Out),hay vào trước sẽ lấy ra sau theo nguyêntắc FILO (First In Last Out).

2

Page 3: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

3

Push

Stack

Top

Data

Stack

Top

Pop

Stack

Top

Data

Stack

Top

Page 4: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Tổ chức dữ liệu và định nghĩa kiểu• Cách 1: Sử dụng một mảng với thao tác: Thêm cuối. Lấy cuối.

• Cách 2: Sử dụng một danh sách liên kếtđơn với thao tác: Thêm đầu. Lấy đầu.

4

Page 5: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Các thao tác trên stack• Khởi tạo stack• Kiểm tra stack rỗng• Kiểm tra stack đầy• Thêm 1 phần tử vào stack (push)• Lấy một phần tử ra khỏi stack (pop)

5

Page 6: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt stack bằng mảng• Định nghĩa cấu trúc Stack#define MAX 100struct Stack{

int n;int e[MAX];

};• Hàm khởi tạovoid init (Stack &s){

s.n=-1;}

6

Page 7: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt stack bằng mảng• Kiểm tra ngăn xếp rỗngint isEmpty (Stack s){

if(s.n==-1)return 1;

return 0;}• Kiểm tra ngăn xếp đầyint isFull (Stack s){

return (s.n==MAX-1);}

7

Page 8: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Thêm 1 phần tử vào stackvoid push (Stack &s, int x){

if(isFull(s))cout<<"Ngan xep day!";

else{

s.n++;s.e[s.n]=x;

}}

8

Page 9: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Lấy 1 phần tử ra khỏi stackint pop (Stack &s){

if(isEmpty(s)){

cout<<"Ngan xep rong";return -1;

}else

return s.e[s.n--];}

9

Page 10: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Hàm inputvoid input (Stack &s){

int m,x;cout<<"Nhap so phan tu: ";cin>>m;for(int i=0;i<m;i++){

cout<<"Nhap gia tri: ";cin>>x;push(s,x);

}}

10

Page 11: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Hàm main• Hàm outputvoid output (Stack &s){

while(isEmpty(s)==0)cout<<pop(s)<<" ";

}• Hàm mainint main (){

Stack S;init(S);input(S);cout<<"Lay cac phan tu ra ngan xep: ";output(S);

} 11

Page 12: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt stack bằng danh sách liên kết

• Định nghĩa cấu trúc Stackstruct node{

int data;node *next;

};typedef node * Pnode;

12

Page 13: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt stack bằng danh sách liên kết• Khởi tạo stackvoid init (Pnode &H){

H=NULL;}• Kiểm tra stack rỗngint isEmpty (Pnode H){

return (H==NULL);}

13

Page 14: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Thêm 1 phần tử vào stackvoid push (Pnode &H,int x){

Pnode p;p=new node;p->data=x;p->next=H;H=p;

}

14

Page 15: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Lấy 1 phần tử ra khỏi stackint pop (Pnode &H){

int x;Pnode p;x=H->data;p=H;H=H->next;delete p;return x;

}15

Page 16: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Một số ứng dụng của stack• Đảo ngược chuỗi ký tự.• Chuyển đổi số từ hệ thập phân sang hệ

cơ số bất kỳ.• Tính giá trị biểu thức dạng hậu tố (postfix).• Chuyển một biểu thức dạng trung tố sang

hậu tố (infix to postfix).• Sử dụng stack trong các trường hợp khử

đệ quy để loại bỏ tính đệ quy trongchương trình.

16

Page 17: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Bài tập1. Viết chương trình cài đặt ngăn xếp các số

nguyên bằng mảng.2. Viết chương trình cài đặt ngăn xếp các số

nguyên bằng danh sách liên kết.3. Viết chương trình đổi 1 số từ hệ thập

phân sang hệ nhị phân.4. Viết chương trình đảo ngược chuỗi sử

dụng stack.

17

Page 18: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Queue• Hàng đợi là một cấu trúc dữ liệu gần giống với

ngăn xếp, nhưng khác ngăn xếp ở nguyên tắcchọn phần tử cần lấy ra. Phần tử được lấy rakhỏi hàng đợi không phải là phần tử mới nhấtđược thêm vào, mà là phần tử đã được đưa vàohàng đợi lâu nhất.

18

• Việc thêm một đối tượngvào hàng đợi hoặc lấy ramột đối tượng từ hàng đợiđược thực hiện theo cơchế “vào trước ra trước” -FIFO (Fisrt In First Out).

Page 19: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Tổ chức cài đặt queue• Cách 1: Sử dụng 1 mảng để lưu trữ các

phần tử trong hàng đợi với thao tác: Thêm cuối Lấy đầu

• Cách 2: Sử dụng danh sách liên kết đơnquản lý bằng 2 con trỏ, với thao tác: Thêm cuối Lấy đầu

19

Page 20: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Các thao tác trên queue• Khởi tạo queue• Kiểm tra queue rỗng• Kiểm tra queue đầy• Thêm 1 phần tử vào queue (put)• Lấy một phần tử ra khỏi queue (get)

20

Page 21: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt queue bằng mảng• Cấu trúc queue gồm các thành phần: Mảng một chiều lưu trữ các phần tử. Phần tử đầu hàng đợi (front), có chỉ số là f. Phần tử cuối hàng đợi (rear), có chỉ số là r.

• Nếu mảng tính từ chỉ số 0 thì ban đầu khởi tạof=0, r=-1.

• Để thêm 1 phần tử vào queue, tăng r lên 1 vàthêm phần tử vào vị trí r.

• Để loại 1 phần tử khỏi queue, lấy giá trị ở vị trí f vàtăng chỉ số f lên 1.

• Khi r tăng lên hết khoảng chỉ số của mảng thìmảng đầy, khi đó không thể thêm vào mảng đượcnữa.

• Khi f>r thì queue rỗng.21

Page 22: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt queue bằng mảng#define MAX 100struct Queue{

int f, r;int e[MAX];

};void init (Queue &q){

q.f=0;q.r=-1;

}

int IsEmpty (Queue q){

if (q.f > q.r)return 1;

return 0;}int IsFull (Queue q){

if (q.r== MAX)return 1;

return 0;}

22

Page 23: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Hàm putvoid put (Queue &q, int x){

q.r++; // tăng r lên 1if (IsFull(q))

cout<<“Queue full!”;else

q.e[q.r] = x;}

23

Page 24: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Hàm getint get (Queue &q){

int x;if (IsEmpty(q))

cout<<“Queue empty!”;elsex = q.e[q.f++];return x;

}24

Page 25: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt queue bằng danh sách liên kết • Định nghĩa cấu trúc queue gồm 2 con trỏ: 1 con

trỏ chỉ đầu danh sách và 1 con trỏ chỉ đến cuốidanh sách.

struct node{

int data;node *next;

};typedef node * Pnode;struct Queue{

Pnode H, T;};

25

• Khởi tạo queuevoid init (Queue &q){

q.H=q.T=NULL;}• Kiểm tra queue rỗngint isEmpty (Queue q){

if(q.H==NULL)return 1;

return 0;}

Page 26: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Cài đặt queue bằng danh sách liên kết Thêm 1 phần tử vào Queuevoid put (Queue &q, int x){

if (isEmpty(q)){

q.H=new node;q.H->data=x;q.H->next=q.T;q.T=q.H;return;

}q.T->next=new node;q.T=q.T->next;q.T->data=x;q.T->next=NULL;

}

Lấy 1 phần tử ra khỏi Queueint get (Queue &q){

Pnode p;int x;p=q.H;q.H=p->next;if (isEmpty(q)){

q.T=NULL;}x=p->data;delete p;return x;

} 26

Page 27: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Hàm inputvoid input (Queue &q){

int m,x;cout<<"Nhap so phan tu: ";cin>>m;for(int i=0;i<m;i++){

cout<<"Nhap gia tri: ";cin>>x;put(q,x);

}}

27

Page 28: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Hàm output, main• Hàm outputvoid output (Queue &q){

while(isEmpty(q)==0)cout<<get(q)<<" ";

cout<<"\n";}• Hàm mainint main (){

Queue q;init(q);input(q);cout<<"Lay cac phan tu ra hang doi: ";output(q);

} 28

Page 29: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Các ứng dụng queue• Các vấn đề liên quan đến cơ chế “vào trước

ra trước” đều có thể dùng cấu trúc dữ liệuqueue.

• Ví dụ cơ chế sản xuất và tiêu thụ: hàng hóasản xuất trước được đưa vào kho và sẽđược xuất ra trước.

• Ứng dụng đặt vé tàu lửa, máy bay, hệ thốngrút tiền…

• Ứng dụng trong hệ điều hành: bộ đếm ứngdụng, hàng đợi xử lý các sự kiện, xử lý phímnhấn, tiến trình…

29

Page 30: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 NGĂN XẾP & HÀNG ĐỢI · PDF fileCài đặt queue bằng danh sách liên kết • Địnhnghĩacấutrúc queue gồm2 con trỏ:

Bài tập1. Viết chương trình cài đặt hàng đợi các số

nguyên bằng mảng.2. Viết chương trình cài đặt hàng đợi các số

nguyên bằng danh sách liên kết.

30