3

KHOA CÔNG NGHỆ THÔNG TIN

4

KHOA CÔNG NGHỆ THÔNG TIN

Cơ chế: Last In First Out LIFO

Stack

5

KHOA CÔNG NGHỆ THÔNG TIN

Mảng 1 chiều

Danh sách liên kết đơn

Cấp phát động!

Kích thước stack khi quá thiếu, lúc quá thừa

Push/Pop khá dễ dàng

Push / Pop hơi phức tạp

6

KHOA CÔNG NGHỆ THÔNG TIN

• Để khai báo một stack, ta cần một mảng 1 chiều S,

biến nguyên t cho biết chỉ số của đầu stack và hằng

số N cho biết kích thước tối đa của

struct Stack{

Data D [N]; count; int }

7

KHOA CÔNG NGHỆ THÔNG TIN

• Lệnh count = 0 sẽ tạo ra một stack S rỗng. • Giá trị của count sẽ cho biết số phần tử hiện

hành có trong stack

• Khi cài đặt bằng mảng 1 chiều, stack có kích thước tối đa nên cần xây dựng thêm một thao tác phụ cho stack:

• IsFull(): Kiểm tra xem stack có đầy chưa. • Khi stack đầy, việc gọi đến hàm push() sẽ

phát sinh ra lỗi.(overflow error)

8

KHOA CÔNG NGHỆ THÔNG TIN

class StackByArray

{

int[] iData; // lưu dữ liệu của stack int icount; // số phần tử stack đang lưu trữ public StackByArray(int size) {

iData = new int[size]; icount = 0;

}

}

9

KHOA CÔNG NGHỆ THÔNG TIN

Thêm một phần tử x vào stack S

void Push(Stack S,Data x)

if(S.count < N) // stack chưa đầy

{

S.D[count] = x;

{

S.count++;

}

else puts("Stack đầy");

}

10

KHOA CÔNG NGHỆ THÔNG TIN

public bool Push( int ivalue)

{

if (icount < iData.Length) // stack chưa đầy

{

iData[icount] = ivalue;// bỏ giá trị vào stack

icount++; // tăng số phần tử trong stack

return true; // thêm phần tử thành công

}

else

{

// stack đầy, overflow error

return false; // thêm phần tử thất bại

}

}

11

KHOA CÔNG NGHỆ THÔNG TIN

Trích thông tin và huỷ phần tử ở đỉnh stack S

Data Pop(Stack S)

{

Data

x;

if(S.count > 0) // stack khác rỗng

S.count--;

{

x = S.D[count];

return x;

}

else puts("Stack rỗng")

}

12

KHOA CÔNG NGHỆ THÔNG TIN

public int Pop()

{

if (icount>0) {

icount--; // giảm số lượng phần tử trong stack return iData[icount + 1]; // trả giá trị đỉnh stack về

} else

{

// stack không có phần tử, underflow error return int.MinValue; // trả min số nguyên về để biết mảng không có phần tử

}

13

} KHOA CÔNG NGHỆ THÔNG TIN

• Lệnh count = 0 sẽ tạo ra một stack S rỗng. • Giá trị của count sẽ cho biết số phần tử hiện

hành có trong stack

• Khi cài đặt bằng mảng 1 chiều, stack có kích thước tối đa nên cần xây dựng thêm một thao tác phụ cho stack:

• IsFull(): Kiểm tra xem stack có đầy chưa. • Khi stack đầy, việc gọi đến hàm push() sẽ

phát sinh ra lỗi.

14

KHOA CÔNG NGHỆ THÔNG TIN

Kiểm tra stack rỗng hay không char IsEmpty(Stack S) {

if(S.count == 0) // stack rỗng return 1; else return 0;

} Kiểm tra stack đầy hay không char IsFull(Stack S) {

if(S.count>= N) // stack đầy

return 1;

else

return 0;

}

15

KHOA CÔNG NGHỆ THÔNG TIN

• Xem thông tin của phần tử ở đỉnh stack S Data Top() {

Data x; if(count > 0) // stack khác rỗng x = S.D[S.count-1]; {

return x;

} else puts("Stack rỗng")

}

16

KHOA CÔNG NGHỆ THÔNG TIN

 Nhận xét: • Các thao tác trên đều làm việc với chi phí O(1). • Việc cài đặt stack thông qua mảng một chiều đơn giản và khá hiệu

quả.

• Tuy nhiên, hạn chế lớn nhất của phương án cài đặt này là giới hạn về kích thước của stack N. Giá trị của N có thể quá nhỏ so với nhu cầu thực tế hoặc quá lớn sẽ làm lãng phí bộ nhớ.

17

KHOA CÔNG NGHỆ THÔNG TIN

• Dùng danh sách liên kết đơn

Head

Đầu ds

Class Node {

info; public Data public Node next;

} Class Stack # Định nghĩa Stack {

public Node Head;

Con trỏ trỏ đến đỉnh của Stack

}

18

KHOA CÔNG NGHỆ THÔNG TIN

• Các thao tác

 Push

 InitStack

 Pop

 IsEmpty

Head

Đầu ds

19

KHOA CÔNG NGHỆ THÔNG TIN

• Push: Thêm 1 phần tử x vào Stack

3

• Tạo node mới có dữ liệu x • Thêm vào đầu danh sách

s

2

1

s

2

3

1

p

New

Hàm thêm 1 phần tử có giá trị x vào Stack

Public void (Data x) {…}

20

KHOA CÔNG NGHỆ THÔNG TIN

• Pop: Lấy 1 phần tử ra khỏi ngăn xếp

• Lấy ra phần tử đầu danh sách • Trả về nội dung và giải phóng nút

s

p

3 3

2

1

3

s

2 1

X=

Hàm lấy một phần tử từ Stack

Public Data Pop() {…}

21

KHOA CÔNG NGHỆ THÔNG TIN

• Khử đệ quy

• Bài toán đổi số, tháp Hà Nội

• Áp dụng cho bài toán dùng cơ chế LIFO

• Chuyển biểu thức trung tố (Infix) sang biểu thức hậu tố

(Postfix)

• Tính giá trị biểu thức hậu tố

22

KHOA CÔNG NGHỆ THÔNG TIN

• Nhập 1 số nguyên (VD: nhập n=13) và cơ số (VD: CoSo=2) , xuất biểu diễn của số theo cơ số này.

13 2

11

6

2

00

3

2

Ngưng chia

11 1 2

1 1

0

1

0 1

1 0 1

1 1 0 1 23

23

KHOA CÔNG NGHỆ THÔNG TIN

1. Hiện thực Stack và các tác vụ của Stack bằng danh sách liên kết.

2. Viết chương trình đổi một số thập phân sang cơ số bất kỳ vận

dụng Stack.

3. Viết chương trình cài đặt bài toán chuyển biểu thức trung tố

sang hậu tố, sau đó tính giá trị biểu thức hậu tố.

24

KHOA CÔNG NGHỆ THÔNG TIN

25

KHOA CÔNG NGHỆ THÔNG TIN

• Hàng đợi là một vật chứa (container) các đối tượng làm việc theo cơ chế FIFO (First In First Out)  việc thêm một đối tượng vào hàng đợi hoặc lấy một đối tượng ra khỏi hàng đợi được thực hiện theo cơ chế “Vào trước ra trước”.

• Các đối tượng có thể được thêm vào hàng đợi bất kỳ lúc nào nhưng chỉ có đối tượng thêm vào đầu tiên mới được phép lấy ra khỏi hàng đợi.

26

26

KHOA CÔNG NGHỆ THÔNG TIN

• Thêm vào cuối và lấy ra ở đầu • FIFO

27

27

KHOA CÔNG NGHỆ THÔNG TIN

• Thêm vào cuối và lấy ra ở đầu • FIFO

28

28

KHOA CÔNG NGHỆ THÔNG TIN

• Dùng DSLK đơn

pHead

pTail

NULL

An

A1

A2

29

KHOA CÔNG NGHỆ THÔNG TIN

• Queue dùng DSLK

Class Node {

• Con trỏ pHead trỏ đầu

danh sách

• Con trỏ pTail trỏ đến cuối

public Data public Node

info; next;

danh sách

• Thao tác Remove diễn ra

ở pHead

• Tháo tác Insert diễn ra ở

} Class Queue {

pTail

• Thao tác thêm xoá dễ

Node Node

pHead; pTail;

dàng ở hai đầu

}

30

KHOA CÔNG NGHỆ THÔNG TIN

• -Cấu trúc hàng đợi-queue, có các chức năng như sau

 EnQueue: Thêm phần tử vào cuối(rear) của hàng đợi-queue.

 DeQueue: Xóa phần tử khỏi đầu(front) của hàng đợi-queue.

Nếu hàng đợi-queue rỗng thì thông báo lỗi.

IsEmpty: Kiểm tra hàng đợi-queue rỗng.

 Front: Lấy giá trị của phần tử ở đầu(front) của hàng đợi-

queue. Lấy giá trị không làm thay đổi hàng đợi-queue.

31

KHOA CÔNG NGHỆ THÔNG TIN

pHead

pTail

5

2

9

new

p

pHead

pTail

X

5

2

9

Public void EnQueue(Data x) {…}

32

KHOA CÔNG NGHỆ THÔNG TIN

• TH: Hàng đợi có 1 phần tử

pTail

pHead

5

p

33

KHOA CÔNG NGHỆ THÔNG TIN

• TH: Hàng đợi có nhiều phần tử

pHead

pTail

5

2

9

5

2

9

pHead pTail

p

34

KHOA CÔNG NGHỆ THÔNG TIN

• Hàng đợi là cấu trúc dữ liệu được dùng khá phổ biến trong thiết kế giải thuật. Bất kỳ khi nào cần quản lý dữ liệu, quá trình,… theo kiểu vào trước ra trước.

• Hệ thống print server

• Cơ chế thông điệp, bộ đệm, hàng đợi xử lý sự

kiện…

• Các ứng dụng đặt vé tàu lửa, máy bay…

• Các hệ thống rút tiền…

35

KHOA CÔNG NGHỆ THÔNG TIN

1. Hiện thực hàng đợi và các tác vụ của hàng đợi

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

2. Viết chương trình quản lý kho hàng dùng hàng đợi được hiện thực bằng danh sách liên kết.

36

KHOA CÔNG NGHỆ THÔNG TIN

1. Hiện thực cấu trúc StackByArray lưu số

nguyên, có các thao tác: • Push(int value) • Pop() • IsEmpty() • Top()

2. Hiện thực QueueByLinkedList lưu số nguyên,

có các thao tác: • Void Enqueue(int value) • Int Dequeue() • Int Count() • Int Top()

37

KHOA CÔNG NGHỆ THÔNG TIN