Download - C3 stack queue

Transcript
Page 1: C3 stack queue

Chương 3.2: NGĂN XẾP – HÀNG ĐỢI

(Stack - Queue)

Page 2: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Nội dung

Ngăn xếp (Stack) Hàng đợi (Queue)

2

Page 3: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Nội dung3

Ngăn xếp (Stack) Khái niệm Stack Các thao tác trên Stack Hiện thực Stack Ứng dụng của Stack

Page 4: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Stack - Khái niệm

Stack là một danh sách mà các đối tượng được thêm vào và lấy ra chỉ ở một đầu của danh sách

Vì thế, thao tác trên Stack được thực hiện theo cơ chế LIFO (Last In First Out - Vào sau ra trước)

4

Page 5: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Stack – Các thao tác

Stack hỗ trợ 2 thao tác chính: Push: Thêm 1 đối tượng vào Stack Pop: Lấy 1 đối tượng ra khỏi Stack

Ví dụ:5 2 3 - - 4

Stack cũng hỗ trợ một số thao tác khác:

isEmpty(): Kiểm tra xem Stack có rỗng không

Top(): Trả về giá trị của phần tử nằm ở đầu

Stack mà không hủy nó khỏi Stack. Nếu Stack

rỗng thì lỗi sẽ xảy ra

5

Page 6: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Stack dùng DSLK6

Khai báo các cấu trúc:

struct Node{

DataType data;Node *next;

};struct Stack{

Node *top;};

Page 7: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Stack dùng DSLK (tt.)

Khởi tạo Stack:

7

void Khoitao(Stack &s){

s.top = NULL;}

Page 8: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Stack dùng DSLK (tt.)

Kiểm tra xem Stack có rỗng không:

8

int isEmpty ( Stack s ){

return s.top == NULL ? 1 : 0; }

Page 9: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Stack dùng DSLK (tt.)

Thêm một phần tử vào Stack:

9

void Push ( Stack &s, DataType x ){

Node *p = new Node;if ( p==NULL ) { cout<<“Khong du bo nho”; return; }p->data = x;p->next = NULL;if (s.top==NULL) // if (isEmpty(s))

s.top = p;else{

p->next = s.top;s.top = p;

}}

Thêm phần tử vào đầu danh sách

Page 10: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Stack dùng DSLK (tt.)

Lấy một phần tử ra khỏi Stack:

10

DataType Pop ( Stack &s ){

if ( s.top==NULL ){cout<<"Stack rỗng"; return 0;

}DataType x;Node *p = s.top;s.top = s.top->next;x = p->data;delete p;return x;

}

Lấy và xóa phần tử ở đầu danh sách

Page 11: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Stack dùng DSLK (tt.)

Xem phần tử ở đỉnh Stack:

11

DataType Top ( Stack s ){

if ( s.top==NULL ){cout<<"Stack rỗng"; return 0;

}DataType x;x = s.top->data;return x;

}

Page 12: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi12

Stack - Ứng dụng

57 2

1 28 2

0 14 2

0 7 2

1 3 2

1 1 2

1 0

57 = 1110012

Ví dụ: 57 = ???2

Bài tập: đổi số từ cơ số 10 sang cơ số x

Page 13: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Nội dung

Ngăn xếp (Stack) Hàng đợi (Queue)

Khái niệm Queue Các thao tác trên Queue Hiện thực Queue Ứng dụng Queue

13

Page 14: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Queue - Khái niệm

Queue là một danh sách mà các đối tượng được thêm vào ở một đầu của danh sách và lấy ra ở một đầu kia của danh sách

Việc thêm một đối tượng luôn diễn ra ở cuối Queue và việc lấy ra một đối tượng luôn diễn ra ở đầu Queue

Vì thế, thao tác trên Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào trước ra trước)

14

Page 15: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Queue - Khái niệm15

Imaging

Page 16: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Queue – Các thao tác

Queue hỗ trợ 2 thao tác chính: EnQueue(): Thêm đối tượng vào cuối (rear) Queue DeQueue(): Lấy đối tượng ở đầu (front) Queue

Ví dụ:5 3 2 - - 4

Queue còn hỗ trợ các thao tác:

isEmpty(): Kiểm tra xem Queue có rỗng không

Front(): Trả về giá trị phần tử nằm ở đầu Queue mà không hủy nó.

Nếu Queue rỗng thì lỗi sẽ xảy ra

16

Front Rear

Page 17: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Queue dùng DSLK17

Có thể biểu diễn Queue bằng cách sử dụng DSLK đơn Có 2 lựa chọn (cách nào tốt nhất?):

head sẽ là front, tail sẽ là rear

head sẽ là rear, tail sẽ là front

b c m nfront

rear

a

b c m nrear

front

a

Page 18: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Queue dùng DSLK18

Khai báo các cấu trúc:

struct Node{

DataType data;Node *next;

};struct Queue{

Node *front, *rear;};

Page 19: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Queue dùng DSLK

Khởi tạo Queue rỗng:

Kiểm tra hàng đợi rỗng :

19

void Khoitao(Queue &q){

q.front = q.rear = NULL; }

int isEmpty(Queue &q){

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

else return 0;

}

Page 20: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Queue dùng DSLK

Thêm một phần tử p vào cuối Queue:

20

void EnQueue(Queue &q, DataType x){

Node *p = new Node;if (p==NULL) exit(1); //Khong du bo nhop->next = NULL;p->data = x;if (q.front==NULL) // TH Queue rỗngq.front = q.rear = p;else{

q.rear->next = p;q.rear = p;

}}

Page 21: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Queue dùng DSLK

Lấy phần tử ra khỏi Queue:

21

DataType DeQueue(Queue &q){

if (isEmpty(q)) {cout<<“Queue rong”;return 0;

}Node *p = q.front;DataType x = p->data;q.front = q.front->pNext;if ( q.front==NULL ) q.rear =

NULL;delete p;return x;

}

Page 22: C3 stack queue

Chương 3: Ngăn xếp – Hàng đợi

Hiện thực Queue dùng DSLK

Xem thông tin của phần tử ở đầu Queue:

DataType Front(Queue q){

if (isEmpty(q)) {

cout<<“Queue rong”;return 0;

}return q.front->data;

}


Top Related