Định nghĩa:

35
Định nghĩa: Định nghĩa: Stack Stack là một danh sách đặc biệt mà là một danh sách đặc biệt mà phép phép thêm vào hoặc loại bỏ một thêm vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu phần tử chỉ thực hiện tại một đầu gọi là đỉnh (Top) của Stack. gọi là đỉnh (Top) của Stack.

Upload: reagan-gutierrez

Post on 03-Jan-2016

48 views

Category:

Documents


0 download

DESCRIPTION

Định nghĩa:. Stack là một danh sách đặc biệt mà phép thêm vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu gọi là đỉnh (Top) của Stack. đỉnh. đáy. Như vậy, stack hoạt động theo cơ chế vào sau ra trước (Last In First Out). Do đó stack còn được gọi là danh sách kiểu LIFO. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Định nghĩa:

Định nghĩa:Định nghĩa:

Stack Stack là một danh sách đặc biệt mà phéplà một danh sách đặc biệt mà phép thêm vào hoặc loại bỏ một phần tử chỉ thực thêm vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu gọi là đỉnh (Top) của Stack. hiện tại một đầu gọi là đỉnh (Top) của Stack.

Page 2: Định nghĩa:

đỉnh

đáy

Page 3: Định nghĩa:

Như vậy, stack hoạt động theo cơ chế vào Như vậy, stack hoạt động theo cơ chế vào sau ra trước (Last In First Out).sau ra trước (Last In First Out).

Do đó stack còn được gọi là danh sách Do đó stack còn được gọi là danh sách kiểu kiểu LIFOLIFO..

Page 4: Định nghĩa:

Khởi tạo stack:Khởi tạo stack:

• Tạo stack bằng cách khai báo mảng một Tạo stack bằng cách khai báo mảng một chiều S với kích thước tối đa là N và biến chiều S với kích thước tối đa là N và biến nguyên t cho biết chỉ số của đỉnh stack.nguyên t cho biết chỉ số của đỉnh stack.

• Như vậy, stack hiện có t+1 phần tử và có thể Như vậy, stack hiện có t+1 phần tử và có thể chứa tối đa N phần tử.chứa tối đa N phần tử.

• Khai báo:Khai báo: Data S[N];Data S[N];

int t;int t; Lệnh t=-1 sẽ tạo ra một stack rỗng.Lệnh t=-1 sẽ tạo ra một stack rỗng.

Page 5: Định nghĩa:

Ví dụ:Ví dụ:

1 7 1 0s S[0] S[1] S[2] S[3]

N=6 ; t=3

Page 6: Định nghĩa:

Các phép toán trên Stack:Các phép toán trên Stack:

• Kiểm tra stack rỗng hay không.Kiểm tra stack rỗng hay không.

• Kiểm tra stack đầy hay không.Kiểm tra stack đầy hay không.

• Thêm một phần tử vào stack.Thêm một phần tử vào stack.

• Xem thông tin của phần tử ở đỉnh stack.Xem thông tin của phần tử ở đỉnh stack.

• Trích thông tin và hủy phần tử ở đỉnh stack.Trích thông tin và hủy phần tử ở đỉnh stack.

Page 7: Định nghĩa:

Kiểm tra stack rỗng hay không:Kiểm tra stack rỗng hay không:

int Empty()int Empty()

{ {

if (t== -1) if (t== -1) // stack rỗng// stack rỗng

return 0;return 0;

elseelse

return 1;return 1;

}}

Page 8: Định nghĩa:

Kiểm tra stack đầy hay khôngKiểm tra stack đầy hay không::

int Full()int Full()

{{

if ( t==N-1 ) if ( t==N-1 ) // stack đầy// stack đầy

return 1;return 1;

elseelse

return 0;return 0;

}}

Page 9: Định nghĩa:

Thêm phần tử x vào stack:Thêm phần tử x vào stack:void Push( Data x, int& t )void Push( Data x, int& t ){{

if ( t<N -1) if ( t<N -1) // stack chưa đầy// stack chưa đầy{{

t++;t++;S[t]=x;S[t]=x;

}}else cout<<“Stack đầy”;else cout<<“Stack đầy”;

}}

Page 10: Định nghĩa:

Xem thông tin của phần tử ở đỉnh stackXem thông tin của phần tử ở đỉnh stack

Data Top( )Data Top( ){ { if ( t>-1 ) if ( t>-1 ) // stack khác rỗng// stack khác rỗng return S[t];return S[t]; else cout<<“”stack rỗng’’;else cout<<“”stack rỗng’’; return 0;return 0;}}

Page 11: Định nghĩa:

Data Pop(int& t)Data Pop(int& t){{

if ( t>-1 ) if ( t>-1 ) // stack khác rỗng // stack khác rỗng {{

Data tam=S[t]; Data tam=S[t]; t--;t--;

return tam;return tam; }}else cout<<“Stack rỗng”;else cout<<“Stack rỗng”;

return 0;return 0;}}

Trích thông tinTrích thông tinvà hủy phần tử ở đỉnh stackvà hủy phần tử ở đỉnh stack

Page 12: Định nghĩa:

Ứng dụng của stack:Ứng dụng của stack:

Đổi cơ số từ thập phân sang nhị phân.Đổi cơ số từ thập phân sang nhị phân.Tính giá trị của một biểu thức ở dạng hậu Tính giá trị của một biểu thức ở dạng hậu

tố.tố.

Page 13: Định nghĩa:

17 21 2

22

2

8 4

2 1

0

00

01

Đổi 17 sang hệ nhị phânĐổi 17 sang hệ nhị phân

Page 14: Định nghĩa:

Đổi sang hệ nhị phân:Đổi sang hệ nhị phân:

void change( int n )void change( int n ){{ int r,m=n;int r,m=n; while (m>0)while (m>0) {{ r = m%2;r = m%2; Push( r, t );Push( r, t );

m = m/2;m = m/2; }}

while ( Empty()!=0 )while ( Empty()!=0 ) cout<< Pop(t);cout<< Pop(t);}}

Page 15: Định nghĩa:

Ký tựKý tựThao tácThao tác Trạng thái stackTrạng thái stack

55 Push 5Push 5 55

11 Push 1Push 1 5, 15, 1

22 Push 2Push 2 5, 1, 25, 1, 2

++ Tính 1 + 2 Tính 1 + 2 Push 3Push 3

5, 35, 3

44 Push 4Push 4 5, 3, 45, 3, 4

** Tính 3 * 4Tính 3 * 4Push 12Push 12

5, 125, 12

++ Tính 12 + 5 Tính 12 + 5 Push 17Push 17

1717

33 Push 3Push 3 17, 317, 3

++ Tính 17 + 3Tính 17 + 3Push 20Push 20

2020

Tính giá trị của: 512+4*+3+ =?Tính giá trị của: 512+4*+3+ =?

Page 16: Định nghĩa:

Ký tựKý tự Thao tácThao tác StackStack Chuỗi hậu tốChuỗi hậu tố

33 Ghi 3 vào k.quảGhi 3 vào k.quả    33

++ Push +Push + ++   

44 Ghi 4 vào k.quảGhi 4 vào k.quả    3 43 4

** Push *Push * + * + *   

22 Ghi 2 vào kquảGhi 2 vào kquả    3 4 23 4 2

// Lấy * ra khỏi stack, Lấy * ra khỏi stack, ghi vào k.quả, push /ghi vào k.quả, push /

+  /+  / 3 4 2 *3 4 2 *

(( Push ( Push ( + / (+ / ( 3 4 2 *3 4 2 *

11 Ghi 1 vào k.quảGhi 1 vào k.quả + / ( + / ( 3 4 2 * 13 4 2 * 1

-- Push -Push - + / ( - + / ( - 3 4 2 * 13 4 2 * 1

55 Ghi 5 vào k.quả Ghi 5 vào k.quả + / ( - + / ( - 3 4 2 * 1 53 4 2 * 1 5

)) Pop cho đến khi lấy Pop cho đến khi lấy được (, ghi các toán được (, ghi các toán tử pop được ra k.quả tử pop được ra k.quả

+ / + / 3 4 2 * 1 5 -3 4 2 * 1 5 -

   Pop tất cả các toán tử Pop tất cả các toán tử ra khỏi ngăn xếp và ra khỏi ngăn xếp và ghi vào kết quảghi vào kết quả

   3 4 2 * 1 5 – / +3 4 2 * 1 5 – / +

3+4*2/(1-5)

Đổi từ trung tố Đổi từ trung tố sang hậu tốsang hậu tố

Page 17: Định nghĩa:

Ý tưởng:Ý tưởng:Nếu gặp một toán hạng (con số hoặc biến) thì ghi nó Nếu gặp một toán hạng (con số hoặc biến) thì ghi nó

vào chuỗi kết quả (chuỗi kết quả là biểu thức trung tố). vào chuỗi kết quả (chuỗi kết quả là biểu thức trung tố). Nếu gặp dấu mở ngoặc, đưa nó vào stack.Nếu gặp dấu mở ngoặc, đưa nó vào stack.Nếu gặp một toán tử (gọi là x1 ), thực hiện hai bước Nếu gặp một toán tử (gọi là x1 ), thực hiện hai bước

sau: sau: Chừng nào còn có một toán tử x2 ở đỉnh ngăn xếp và Chừng nào còn có một toán tử x2 ở đỉnh ngăn xếp và

độ ưu tiên của x1 nhỏ hơn hay băngđộ ưu tiên của x1 nhỏ hơn hay băng độ ưu tiên của x2 độ ưu tiên của x2 thì lấy x2 ra khỏi ngăn xếp và ghi vào kết quả. thì lấy x2 ra khỏi ngăn xếp và ghi vào kết quả.

Push x1 vào ngăn xếp Push x1 vào ngăn xếp Nếu gặp dấu đóng ngoặc thì cứ lấy các toán tử trong Nếu gặp dấu đóng ngoặc thì cứ lấy các toán tử trong

ngăn xếp ra và ghi vào kết quả cho đến khi lấy được ngăn xếp ra và ghi vào kết quả cho đến khi lấy được dấu mở ngoặc ra khỏi ngăn xếp.dấu mở ngoặc ra khỏi ngăn xếp.

Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả toán hạng (nếu có) từ ngăn xếp ra và ghi vào chuỗi toán hạng (nếu có) từ ngăn xếp ra và ghi vào chuỗi kết quả. kết quả.

Page 18: Định nghĩa:

Haøng ñôïiHaøng ñôïiÑònh nghóa:Ñònh nghóa: H aøng ñôïi laø moät vaät chöùa H aøng ñôïi laø moät vaät chöùa caùc ñoái töôïng laøm vieäc theo cô caùc ñoái töôïng laøm vieäc theo cô cheá FIFO:cheá FIFO: Nghóa laø vieäc theâm moät ñoái Nghóa laø vieäc theâm moät ñoái töôïng vaøo haøng ñôïi hoaëc laáy töôïng vaøo haøng ñôïi hoaëc laáy moät ñoái töôïng ra khoûi haøng moät ñoái töôïng ra khoûi haøng ñôïi ñöôïc thöïc hieän theo cô cheá ñôïi ñöôïc thöïc hieän theo cô cheá “vaøo tröôùc ra tröôùc”“vaøo tröôùc ra tröôùc”

Page 19: Định nghĩa:

VíVí duï: duï:

Xeáp haøng ñôïi khaùm beänh. Xeáp haøng ñôïi khaùm beänh. Ñôïi mua veù xe löûa.Ñôïi mua veù xe löûa. Xeáp haøng vaøo phXeáp haøng vaøo phòng thiòng thi……

Ai tôùi tröôùc thì ñöôïc khaùm tröôùc, Ai tôùi tröôùc thì ñöôïc khaùm tröôùc, ñöôïc mua veùñöôïc mua veù

tröôùc vaø ngöôøi ôû ñaàu haøng tröôùc vaø ngöôøi ôû ñaàu haøng ñöôïc vaøo phñöôïc vaøo phòngòng tröôùc. tröôùc.

Page 20: Định nghĩa:

Bieåu dieãn duøng Bieåu dieãn duøng maûng:maûng:

Ta coù theå taïo haøng ñôïi baèng caùch söû Ta coù theå taïo haøng ñôïi baèng caùch söû duïng moät maûng 1 chieàu vôùi kích duïng moät maûng 1 chieàu vôùi kích thöôùc toái ña laø N.thöôùc toái ña laø N.

Phaàn töû naèm ôû ñaàu haøng ñôïi coù Phaàn töû naèm ôû ñaàu haøng ñôïi coù chæ soá f vaø phaàn töû naèm ôû cuoái chæ soá f vaø phaàn töû naèm ôû cuoái haøng ñôïi coù chæ soá r.haøng ñôïi coù chæ soá r.

Page 21: Định nghĩa:

AA BB CC DD EE

ff

AA BB CC DD EE GG

rr

ff rr

BB CC DD EE GG

ff rr

Q biểu diễn bằng mảng tịnh tiến

Page 22: Định nghĩa:

Khôûi taïo Queue baèng maûng Khôûi taïo Queue baèng maûng tònh tieántònh tieán

Data Q[N] Data Q[N]

int f = 0;int f = 0;

int r = -1;int r = -1;

Page 23: Định nghĩa:

Kieåm tra haøng ñôïi Kieåm tra haøng ñôïi roãngroãng

• Thuaät toaùn:Thuaät toaùn: Neáu f > r thì haøng ñôïi roãngNeáu f > r thì haøng ñôïi roãng ngöôïc laïi haøng ñôïi khoâng roãng.ngöôïc laïi haøng ñôïi khoâng roãng.int Emty()int Emty(){{ if ( f > r) retunr 0; if ( f > r) retunr 0; //haøng ñôïi roãng.//haøng ñôïi roãng. else return 1; else return 1; // haøng ñôïi khoâng roãng// haøng ñôïi khoâng roãng..}}

Page 24: Định nghĩa:

Kieåm tra haøng ñôïi Kieåm tra haøng ñôïi ñaày:ñaày:• Thuaät toaùn:Thuaät toaùn:

Neáu (r – f +1) = N thì haøng ñôïi ñaày.Neáu (r – f +1) = N thì haøng ñôïi ñaày.

Ngöôïc laïi haøng ñôïi khoâng ñaày.Ngöôïc laïi haøng ñôïi khoâng ñaày.

int Full()int Full()

{{

if ((r- f+ 1) = N) return 1; if ((r- f+ 1) = N) return 1; //haøng ñôïi //haøng ñôïi ñaàyñaày..

else return 0; else return 0; // haønh ñôïi khoâng ñaày.// haønh ñôïi khoâng ñaày.

}}

Page 25: Định nghĩa:

Theâm pt vaøo Theâm pt vaøo haøng ñôïi:haøng ñôïi:Thuaät toaùn:Thuaät toaùn:

B1: if Full() = 0 then B1: if Full() = 0 then

if r = N-1 thenif r = N-1 then

for i=0 to r-f Q[i] = Q[f+i]for i=0 to r-f Q[i] = Q[f+i]

r = r-f+1; f=0 r = r-f+1; f=0

Q[r] = xQ[r] = x

B2: if Full() = 1 then Q ñaày.B2: if Full() = 1 then Q ñaày.

Page 26: Định nghĩa:

Theâm pt vaøo haøng ñôïi:Theâm pt vaøo haøng ñôïi:void enQ( data x)void enQ( data x){{ if ( Full() == 0)if ( Full() == 0) {{ if ( r == N- 1) if ( r == N- 1) {{ for ( int i= 0; i<= r – f; i++) Q[i] = Q[f+i];for ( int i= 0; i<= r – f; i++) Q[i] = Q[f+i]; r = r – f;r = r – f; f= 0;f= 0; } } r++;r++; Q[r] = x; Q[r] = x; }} else cout<< “ Q else cout<< “ Q đầy”;đầy”; }}

Page 27: Định nghĩa:

Xem, huyû phaàn töû Xem, huyû phaàn töû ôû ñaàu Q:ôû ñaàu Q:

ddataata deQ() deQ()

{{

data x = Q[f];data x = Q[f];

f++;f++;

retreturn x;urn x;

}}

Page 28: Định nghĩa:

NhNhận xét:ận xét:

Khi theâm hoaêc laáy phaàn töû ra Khi theâm hoaêc laáy phaàn töû ra khoûi haøng ñôïi khieán cho haønh khoûi haøng ñôïi khieán cho haønh ñôïi chaïy khaép khoâng gian boä ñôïi chaïy khaép khoâng gian boä nhôù. nhôù.

Do ñoù ta khaéc phuïc baèng caùch Do ñoù ta khaéc phuïc baèng caùch duøng maûng xuay voøng ñeå bieåu duøng maûng xuay voøng ñeå bieåu dieãn haøng ñôïi.dieãn haøng ñôïi.

Page 29: Định nghĩa:

Biểu diễn Queue dùng mảng xuay vòngBiểu diễn Queue dùng mảng xuay vòng

BB

0077

11

22

33

66

55 44

ff

BB

CCDD

EE

rr

Page 30: Định nghĩa:

Các thao tácCác thao tác

Khởi tạo Queue.Khởi tạo Queue.Kiểm Queue rỗng.Kiểm Queue rỗng.Truy xuất phần tử đầu Queue.Truy xuất phần tử đầu Queue.

Khai báo giống như trong mảng tịnh tiến.Khai báo giống như trong mảng tịnh tiến.

Page 31: Định nghĩa:

Kiểm tra Queue đầy.Kiểm tra Queue đầy.

int Full()int Full()

{ {

if((f==r+1&&r != -1)||(f==0&&r==N-1))if((f==r+1&&r != -1)||(f==0&&r==N-1))

return 1; return 1; // Q đầy// Q đầy

else return 0; else return 0; // Q không đầy// Q không đầy

}}

Page 32: Định nghĩa:

Thêm phần tử vào cuối QThêm phần tử vào cuối Q

void enQ(void enQ(data xdata x)){{ if(Full()==0) if(Full()==0) {{ if(r ==N-1) r =-1;if(r ==N-1) r =-1; r++; Q[r]=x;r++; Q[r]=x; }} else cout<<“ Queue đầy”;else cout<<“ Queue đầy”;}}

Page 33: Định nghĩa:

Trích, hủy phần tử ở đầu QTrích, hủy phần tử ở đầu Q

data deQ()data deQ(){{ data x = Q[f];data x = Q[f]; if(f < N-1) f++;if(f < N-1) f++; else f=0;else f=0; return x;return x;}}

Page 34: Định nghĩa:

3

4

1

7

6

85

10

11

2

deQ() duyệtdeQ() duyệt enQ()enQ() QQ

f ----- rf ----- r

11 11

11 2 32 3 2 32 3

22 33

33 4 74 7

44 5 8 65 8 6 7 5 8 67 5 8 6

77 1111 5 8 6 115 8 6 11

55 8 6 118 6 11

88 6 116 11

66 1010 6 11 106 11 10

66 11 1011 10

1111 1010

1010

Duyệt đồ thị có Duyệt đồ thị có sử dụng Queuesử dụng Queue

Ví dụ:Ví dụ:

Page 35: Định nghĩa:

3

4

1

7

6

85

10

11

2

BB

00

77

11

2233

66

55 44

ff

BB

CCDD

EE

rr