Định nghĩa:

Preview:

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

Citation preview

Đị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.

đỉnh

đáy

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..

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.

Ví dụ:Ví dụ:

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

N=6 ; t=3

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.

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;

}}

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;

}}

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”;

}}

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;}}

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

Ứ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ố.

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

Đổ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);}}

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+ =?

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ố

Ý 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ả.

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”

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.

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.

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

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;

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..}}

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.

}}

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.

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”; }}

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;

}}

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.

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

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.

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

}}

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”;}}

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;}}

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ụ:

3

4

1

7

6

85

10

11

2

BB

00

77

11

2233

66

55 44

ff

BB

CCDD

EE

rr

Recommended