
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 6 - Nguyễn Mạnh Sơn
lượt xem 1
download

Bài giảng "Cấu trúc dữ liệu và giải thuật" Bài 6 - Các thuật toán với ngăn xếp, cung cấp cho sinh viên những kiến thức như: tổng hợp các cấu trúc dữ liệu; hai phương pháp biểu diễn ngăn xếp; cài đặt ngăn xếp sử dụng mảng; ứng dụng của ngăn xếp;... Mời các bạn cùng tham khảo!
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 6 - Nguyễn Mạnh Sơn
- BÀI 6. CÁC THUẬT TOÁN VỚI NGĂN XẾP
- 2 TỔNG HỢP CÁC CẤU TRÚC DỮ LIỆU Thành phần Mảng (Array) Truy cập ngẫu đồng nhất nhiên/trực tiếp Thành phần Bản ghi không đồng nhất (Record) Cấu trúc dữ liệu Tuyến tính Danh sách liên Tổng quát kết (List) Vào-trước-ra- Hàng đợi Truy cập tuần tự trước (Queue) Ngăn xếp Không tuyến tính Tập hợp (Set) Vào-sau-ra-trước (Stack) Trang 2
- 3 NGĂN XẾP Ngăn xếp là gì? • Là một danh sách nhưng các phép toán chỉ được thực hiện ở một đỉnh của danh sách. Tính chất • Vào trước ra sau (First In Last Out: FILO) Trang 3
- 4 NGĂN XẾP Trừu tượng hóa cấu trúc ngăn xếp Đặc tả dữ liệu A = (a0, a1, …, an-1) trong đó an-1 là đỉnh ngăn xếp Đặc tả các phép toán 1. Thêm phần tử x vào đỉnh ngăn xếp: push(x) 2. Loại phần tử ở đỉnh ngăn xếp: pop() 3. Kiểm tra ngăn xếp có rỗng hay không: isEmpty() 4. Kiểm tra ngăn xếp có đầy hay không: isFull() 5. Đếm số phần tử của ngăn xếp: size() 6. Trả về phần tử ở đỉnh ngăn xếp: top() Trang 4
- Hai phương pháp biểu diễn ngăn xếp Biểu diễn liên tục: các phần tử dữ liệu của ngăn xếp được lưu trữ liên tục nhau trong bộ nhớ (Mảng). Biểu diễn rời rạc: các phần tử dữ liệu của ngăn xếp được lưu trữ rời rạc nhau trong bộ nhớ (Danh sách liên kết). Ví dụ. Biểu diễn ngăn xếp dựa vào mảng. typedef struct { int top; //Đỉnh đầu của stack nơi diễn ra mọi thao tác int node[MAX]; //Dữ liệu lưu trữ trong stack gồm MAX phần tử } Stack; top node[top] top top node[top] node[top] Trang 5
- CÀI ĐẶT NGĂN XẾP SỬ DỤNG MẢNG Các thao tác: ▪ Kiểm tra tích rỗng của stack (Empty(stack s)). ▪ Kiểm tra tính đầy của ngăn xếp (Full(stack s)). ▪ Đưa dữ liệu vào ngăn xếp (Push(stack s, item x)). Chỉ được thực hiện khi và chỉ khi ngăn xếp chưa tràn. ▪ Đưa dữ liệu vào ngăn xếp (Pop(stack s). Chỉ được thực hiện khi và chỉ khi ngăn xếp không rỗng. Ví dụ. Trạng thái rỗng, trạng thái đầy của stack. Top= MAX-1 MAX-1 MAX-1 9 … … 7 2 2 5 1 1 3 0 0 1 Trang 6
- CÀI ĐẶT NGĂN XẾP SỬ DỤNG MẢNG Kiểm tra tính rỗng của stack: int Empty( stack *s ) { //s là con trỏ đến stack if ( stack ->top == -1 ) // Nếu top =-1 return (1); //Hàm trả lại giá trị đúng return(0); //Hàm trả lại giá trị sai } Trang 7
- CÀI ĐẶT NGĂN XẾP SỬ DỤNG MẢNG Kiểm tra tính đầy của stack: int Full( stack *s ) { if ( stack ->top == MAX-1 ) return (1); return(0); } Trang 8
- CÀI ĐẶT NGĂN XẾP SỬ DỤNG MẢNG Đưa dữ liệu vào stack void Push( stack *s, int x ) { if ( !Full (s)) s ->top = (s ->top) +1; node[s ->top] = x; } else ; } Trang 9
- CÀI ĐẶT NGĂN XẾP SỬ DỤNG MẢNG Lấy dữ liệu ra khỏi stack int Pop( stack *s ) { if ( !Empty (s)) { x = Node[s ->top]; s ->top = (s ->top) -1; return (x); } else { ; return (∞); } } Trang 10
- Ví dụ. Cho stack lưu trữ tối đa 5 phần tử. Bắt đầu thực hiện tại trạng thái rỗng. top =-1 top =0 top =1 top =2 top =3 top =4 Push(s,9) 9 Push(s,7) 7 7 Push(s,5) 5 5 5 Push(s,3) 3 3 3 3 Push(s,1) 1 1 1 1 1 top =4 top =3 top =2 top =1 top =0 top =-1 9 Pop(s) Pop(s) 7 7 Pop(s) 5 5 5 Pop(s) 3 3 3 3 Pop(s) 1 1 1 1 1 Trang 11
- Các thao tác trên stack dựa danh sách liên kết đơn Stack = { DSLK đơn + [; ] } Stack = { DSLK đơn + [; ] } Các thao tác trên stack: struct node{ int info; struct node *link; }*Stack; class stack_list{ public: node *push(node *, int); node *pop(node *); void traverse(node *); stack_list(){ Stack = NULL; } }; Trang 12
- node *stack_list::push(node *Stack, int item){ node *tmp; tmp = new (struct node); tmp->info = item; tmp->link = Stack; Stack = tmp; return Stack; } node *stack_list::pop(node *Stack){ node *tmp; if (Stack == NULL) cout
- ỨNG DỤNG CỦA NGĂN XẾP ❑ Khử đệ quy ❑ Kiểm soát dấu ngoặc ❑ Biểu diễn và chuyển đổi giữa các cách biểu diễn phép toán ❑ Duyệt cây, duyệt đồ thị… Trang 14
- THƯ VIỆN STL TRONG C++ Trang 15
- 1 6 Ví dụ khai báo và sử dụng stack #include #include #include using namespace std; int main () { stack mystack; for (int i=0; i
- 1 7 Minh họa các thao tác thao tác output ngăn xếp push(3) (3) push(5) (3, 5) pop() (3) top() 3 (3) push(8) (3, 8) pop() (3) size() 1 (3) pop() () pop() lỗi: ngăn xếp rỗng () push(15) (15) top() 15 (15) Trang 17
- 1 8 NHẬN XÉT VỀ NGĂN XẾP Ưu điểm • Gọi n là số phần tử của ngăn xếp • Không gian sử dụng là O(n) • Mỗi thao tác thực hiện trong thời gian O(1) Hạn chế (với cách cài đặt bằng mảng) • Kích thước tối đa của ngăn xếp phải được chỉ định trước và không thể thay đổi • Cố push phần tử mới vào ngăn xếp đã đầy sẽ sinh ngoại lệ do cài đặt (implementation-specific exception) Trang 18
- 1 9 Ví dụ: Kiểm tra biểu thức dấu ngoặc cân xứng Mỗi ngoặc mở “(“, “[“, “{“ phải được cặp với một ngoặc đóng “)“, “]“, “}“ tương ứng. Ví dụ • cân xứng: ( )(( )){([( )])} • không cân xứng: ((( )(( )){([( )])} • không cân xứng: )(( )){([( )])} • không cân xứng: ({[ ])} • không cân xứng: ( Trang 19
- CHUYỂN ĐỔI TRUNG TỐ - HẬU TỐ Biểu thức Hậu tố: •a+bab+ •a-bab- •a*bab* •a/bab/ • (P) P (a + b * c ) − (a / b + c ) = = (a + bc *) − (ab / + c ) = (abc * + ) − (ab / c + ) = abc * + − ab / c + = abc * + ab / c + − Trang 20

CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu & thuật toán: Chương 3 - Nguyễn Đức Nghĩa
0 p |
509 |
166
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p |
194 |
17
-
Bài giảng Cấu trúc dữ liệu: Chương 10 - Nguyễn Xuân Vinh
31 p |
112 |
10
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p |
180 |
9
-
Bài giảng Cấu trúc dữ liệu: Chương Giới thiệu - Nguyễn Xuân Vinh
8 p |
127 |
7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p |
78 |
7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p |
109 |
6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 7 - Châu Thị Bảo Hà
133 p |
126 |
4
-
Bài giảng Cấu trúc dữ liệu: Chương 5 - Cấu trúc dữ liệu cây
32 p |
94 |
4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các khái niệm cơ bản
23 p |
66 |
3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 1 - Nguyễn Mạnh Sơn
34 p |
4 |
1
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 4 - Nguyễn Mạnh Sơn
40 p |
2 |
1
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 2 - Nguyễn Mạnh Sơn
12 p |
2 |
1
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 5 - Nguyễn Mạnh Sơn
30 p |
2 |
1
-
Bài giảng Cấu trúc dữ liệu và giải thuật (Data Structures & Algorithms) - Th.S Đỗ Văn Tiến
163 p |
3 |
1
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 3 - Nguyễn Mạnh Sơn
35 p |
2 |
1
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 8 - Nguyễn Mạnh Sơn
44 p |
6 |
1


Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn
