Cấu Trúc Dữ Liệu Và Giải Thuật Chapter 4.1 Stack . Tài Liệu Bao Gồm 6 Chapter Mong các bạn theo dõi đầy đủ để đạt kết quả cao . Để Cập Nhật Thêm Tìm Hiểu Hơn Nữa Về Tài Liệu IT Thì Các Bạn Có Thể Truy Cập : https:123doc.orgtrangcanhan4336953tailieuit.htm CẢM ƠN CÁC BẠN ĐÃ THEO DÕI
Trang 1Chương 4:
Stack, Queue
1
Trang 2Phần 1: Ngăn xếp (Stack)
Trang 33
Khái niệm Stack
LIFO: Last In First Out
Thao tác Pop, Push chỉ diễn ra ở 1 đầu
Trang 4Biếu diễn stack
Push / Pop hơi
phức tạp
Push/Pop khá dễ dàng
Trang 55
Biểu diễn Stack dùng mảng
Có thể tạo một stack bằng cách khai báo một mảng 1 chiều với kích thước tối đa là N (ví dụ: N =1000)
Stack có thể chứa tối đa N phần tử đánh số từ 0 đến N-1
Phần tử nằm ở đầu stack sẽ có chỉ số Top (lúc đó
trong stack đang chứa Top +1 phần tử)
Để 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 stack
Data S [N];
int Top;
Trang 6typedef struct item {
Trang 7179/44
Các thao tác trên Stack
Các thao tác cơ bản trên stack
Khởi tạo stack: Init (S)
Kiểm tra stack rỗng: Empty (S)
Kiểm tra stack đầy: IsFull (S)
Lấy phần tử ra khỏi Stack: Pop (S, x)
7
Trang 8Biểu diễn Stack dùng mảng
Khởi tạo Stack:
Lệnh Top = -1 sẽ tạo ra một stack S rỗng
Đảm bảo các thao tác trên Stack thực hiện đúng đắn
Thuật toán:
+Vào: Stack đã cần khởi tạo
+ Ra: Stack sau khi khởi tao
B1) Đặt chỉ số top = -1
BKT) Kết thúc;
Trang 99
Biểu diễn Stack dùng mảng
Thuật toán:
+Vào: Stack cần kiểm tra
+ Ra: Giá trị 0 hoặc 1
B1) if top=-1 then return 1
else return 0
BKT) Kết thúc
Kiểm tra stack rỗng
Được gọi đến trước khi thực hiện thao tác lấy phần tử ra khỏi Stack
Stack rỗng nếu chỉ số top = -1
Cài đặt:
int IsEmpty (stack s) {
if (s.top == -1) return 1;
return 0;
}
Trang 10Biểu diễn Stack dùng mảng
Được gọi đến trước khi thực hiện thao tác đưa một phần tử vào stack
Stack đầy nếu top = N-1
Cài đặt:
int IsFull (stack s) {
if (s.top==N-1) return 1;
return 0;
Thuật toán:
+Vào: Stack cần kiểm tra
+ Ra: giá trị 0 hoặc 1
B1) if top = N-1 then return 1;
else return 0;
BKT) Kết thúc;
Trang 1111
Biểu diễn Stack dùng mảng
Vào: Stack S, phần tử dữ liệu x
Ra: Stack với phần tử dữ liệu trên đỉnh Stack B1) Kiểm tra nếu stack chưa đầy thì:
B1.1) Tăng top lên 1;
B1.2) Giá trị phần tử trên đỉnh Stack = x;
B1.3) Thực hiện bước kết thúc;
B2) Nếu stack rỗng thì thực hiện BKT;
BKT) Kết thúc;
Trang 12Biểu diễn Stack dùng mảng
Trang 1313
Biểu diễn Stack dùng mảng
Vào: Stack S;
Ra: x lưu giá trị phần tử trên đỉnh Stack
B1) Kiểm tra nếu stack không rỗng thì:
B1.1) x = giá trị phần tử trên đỉnh Stack = x; B1.2) Giảm top đi 1 ;
B1.3) Thực hiện bước kết thúc;
B2) Nếu stack rỗng thì thực hiện BKT;
BKT) Kết thúc;
Trang 14Biểu diễn Stack dùng mảng
node Pop(stack &s)
Trang 1515
Biểu diễn Stack dùng mảng
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ả
• 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ớ
Khắc phục: Sử dụng DSLK đơn để biểu diễn stack
Trang 16typedef struct Node
Trang 17179/44
Các thao tác cơ bản trên stack
Khởi tạo stack: Init (S)
Tạo mới 1 nút: CreateNode (x)
Kiểm tra stack rỗng: IsEmpty (S)
Đưa phần tử vào Stack: Push (S,x)
Lấy phần tử ra khỏi Stack: Pop (S, x)
17
Biểu diễn Stack dùng DSLK
Trang 18Khởi tạo stack
Lệnh top = NULL sẽ tạo ra một stack S rỗng
Biểu diễn Stack dùng DSLK
Cài đặt:
void Init ( stack &s) {
s.top = NULL; }
Thuật toán:
+Vào: Stack đã cần khởi tạo
+ Ra: Stack sau khi khởi tao
B1) Đặt top = NULL;
BKT) Kết thúc;
Trang 19return 0; // stack rỗng
}
Kiểm tra stack rỗng
Stack rỗng nếu top = NULL
Thuật toán:
+Vào: Stack cần kiểm tra
+ Ra: Giá trị 0 hoặc 1
B1) if top = NULL then return 1;
else return 0
BKT) Kết thúc
Trang 2121
Biểu diễn Stack dùng mảng
Vào: Stack S, phần tử dữ liệu x
Ra: Stack với phần tử dữ liệu trên đỉnh Stack
B2) Nếu không tạo được nút thì thực hiện BKT;
B3) Kiểm tra nếu danh sách rỗng thì
top = NewNode;
Ngược lại, chèn NewNode vào đầu danh sách BKT) Kết thúc;
Trang 22Cài đặt:
void Push (stack &s, int x){
Node *NewNode = CreateNode (x);
Trang 2323
Biểu diễn Stack dùng mảng
Vào: Stack S;
Ra: Phần tử trên đỉnh Stack
B1) Kiểm tra nếu stack không rỗng thì:
B1.1) p phần tử trên đỉnh Stack;
B1.3) Thực hiện bước kết thúc;
B2) Nếu stack rỗng thì thực hiện BKT; BKT) Kết thúc;
Trang 2525
Ứng dụng của Stack
tự truy xuất ngược với trình tự lưu trữ
hiện các thủ tục, Stack được sử dụng để lưu môi trường của các thủ tục
thuyết đồ thị (như tìm đường đi)