350 likes | 485 Views
Đị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.
E N D
Định nghĩa: Stack là một danh sách đặc biệt mà phépthê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.
Khởi tạo stack: • 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 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ể chứa tối đa N phần tử. • Khai báo: Data S[N]; int t; Lệnh t=-1 sẽ tạo ra một stack rỗng.
1 7 1 0 s N=6 ; t=3 S[0] S[1] S[2] S[3] Ví dụ:
Các phép toán trên Stack: • Kiểm tra stack rỗng hay không. • Kiểm tra stack đầy hay không. • Thêm một phần tử vào 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.
Kiểm tra stack rỗng hay không: int Empty() { if (t== -1) // stack rỗng return 0; else return 1; }
Kiểm tra stack đầy hay không: int Full() { if ( t==N-1 ) // stack đầy return 1; else return 0; }
Thêm phần tử x vào stack: void Push( Data x, int& t ) { if ( t<N -1) // stack chưa đầy { t++; S[t]=x; } else cout<<“Stack đầy”; }
Xem thông tin của phần tử ở đỉnh stack Data Top( ) { if ( t>-1 ) // stack khác rỗng return S[t]; else cout<<“”stack rỗng’’; return 0; }
Trích thông tinvà hủy phần tử ở đỉnh stack Data Pop(int& t) { if ( t>-1 ) // stack khác rỗng { Data tam=S[t]; t--; return tam; } else cout<<“Stack rỗng”; return 0; }
Ứng dụng của stack: • Đổ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ố.
2 2 2 2 2 17 8 1 4 0 2 0 1 0 0 1
Đổi sang hệ nhị phân: void change( int n ) { int r,m=n; while (m>0) { r = m%2; Push( r, t ); m = m/2; } while ( Empty()!=0 ) cout<< Pop(t); }
Ý tưởng: • 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ố). • 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 sau: • 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 x2 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 • 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 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ả toán hạng (nếu có) từ ngăn xếp ra và ghi vào chuỗi kết quả.
Haøng ñôïi Ñònh nghóa: H aøng ñôïi laø moät vaät chöùa caùc ñoái töôïng laøm vieäc theo cô cheá FIFO: Nghóa laø vieäc theâm moät ñoái töôïng vaøo haøng ñôïi hoaëc laáy moät ñoái töôïng ra khoûi haøng ñôïi ñöôïc thöïc hieän theo cô cheá “vaøo tröôùc ra tröôùc”
Ví duï: • Xeáp haøng ñôïi khaùm beänh. • Ñôïi mua veù xe löûa. • Xeáp haøng vaøo phòng thi… Ai tôùi tröôùc thì ñöôïc khaùm tröôùc, ñöôïc mua veù tröôùc vaø ngöôøi ôû ñaàu haøng ñöôïc vaøo phòng tröôùc.
Bieåu dieãn duøng maûng: • 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 thöôùc toái ña laø N. • Phaàn töû naèm ôû ñaàu haøng ñôïi coù chæ soá f vaø phaàn töû naèm ôû cuoái haøng ñôïi coù chæ soá r.
r f r f r f Q biểu diễn bằng mảng tịnh tiến
Khôûi taïo Queue baèng maûng tònh tieán Data Q[N] int f = 0; int r = -1;
Kieåm tra haøng ñôïi roãng • Thuaät toaùn: Neáu f > r thì haøng ñôïi roãng ngöôïc laïi haøng ñôïi khoâng roãng. int Emty() { if ( f > r) retunr 0; //haøng ñôïi roãng. else return 1; // haøng ñôïi khoâng roãng. }
Kieåm tra haøng ñôïi ñaày: • Thuaät toaùn: Neáu (r – f +1) = N thì haøng ñôïi ñaày. Ngöôïc laïi haøng ñôïi khoâng ñaày. int Full() { if ((r- f+ 1) = N) return 1; //haøng ñôïi ñaày. else return 0; // haønh ñôïi khoâng ñaày. }
Theâm pt vaøo haøng ñôïi: Thuaät toaùn: B1: if Full() = 0 then if r = N-1 then for i=0 to r-f Q[i] = Q[f+i] r = r-f+1; f=0 Q[r] = x B2: if Full() = 1 then Q ñaày.
Theâm pt vaøo haøng ñôïi: void enQ( data x) { if ( Full() == 0) { if ( r == N- 1) { for ( int i= 0; i<= r – f; i++) Q[i] = Q[f+i]; r = r – f; f= 0; } r++; Q[r] = x; } else cout<< “ Q đầy”; }
Xem, huyû phaàn töû ôû ñaàu Q: data deQ() { data x = Q[f]; f++; return x; }
Nhận xét: • Khi theâm hoaêc laáy phaàn töû ra khoûi haøng ñôïi khieán cho haønh ñôïi chaïy khaép khoâng gian boä nhôù. • Do ñoù ta khaéc phuïc baèng caùch duøng maûng xuay voøng ñeå bieåu dieãn haøng ñôïi.
1 0 B B 7 2 f C D r 6 3 E 4 5 Biểu diễn Queue dùng mảng xuay vòng
Các thao tác • Khởi tạo Queue. • Kiểm Queue rỗng. • Truy xuất phần tử đầu Queue. Khai báo giống như trong mảng tịnh tiến.
Kiểm tra Queue đầy. int Full() { if((f==r+1&&r != -1)||(f==0&&r==N-1)) return 1; // Q đầy else return 0; // Q không đầy }
Thêm phần tử vào cuối Q void enQ(data x) { if(Full()==0) { if(r ==N-1) r =-1; r++; Q[r]=x; } else cout<<“ Queue đầy”; }
Trích, hủy phần tử ở đầu Q data deQ() { data x = Q[f]; if(f < N-1) f++; else f=0; return x; }
1 3 7 2 4 11 6 5 8 10
1 0 B B 7 2 f C D r 6 3 E 4 5 1 3 7 2 4 11 6 5 8 10