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
Chương 4: Stack, Queue Phần 1: Ngăn xếp (Stack) Khái niệm Stack LIFO: Last In First Out Thao tác Pop, Push diễn đầu Biếu diễn stack Mảng chiều Danh sách LK Cấp phát động! Kích thước stack thiếu, lúc thừa Push/Pop dễ dàng Push / Pop phức tạp Biểu diễn Stack dùng mảng Có thể tạo stack cách khai báo mảng chiều với kích thước tối đa N (ví dụ: N =1000) Stack chứa tối đa N phần tử đánh số từ đến N-1 Phần tử nằm đầu stack có số Top (lúc stack chứa Top +1 phần tử) Để khai báo stack, ta cần mảng chiều S, biến nguyên t cho biết số đầu stack số N cho biết kích thước tối đa stack Data S [N]; int Top; Khai báo Stack typedef struct item { int data; }; typedef struct stack { int top; node Ary[N]; }; Các thao tác Stack Các thao tác stack Khởi tạo stack: Init (S) Kiểm tra stack rỗng: Empty (S) Kiểm tra stack đầy: IsFull (S) Đưa phần tử vào Stack: Push(S,x) Lấy phần tử khỏi Stack: Pop (S, x) 179/44 Biểu diễn Stack dùng mảng Khởi tạo Stack: Lệnh Top = -1 tạo stack S rỗng Đảm bảo thao tác Stack thực đắn Thuật toán: +Vào: Stack cần khởi tạo + Ra: Stack sau khởi tao B1) Đặt số top = -1 BKT) Kết thúc; Cài đặt: void Init (stack &s) { s.top=-1; } Biểu diễn Stack dùng mảng Kiểm tra stack rỗng Được gọi đến trước thực thao tác lấy phần tử khỏi Stack Stack rỗng số top = -1 Thuật toán: +Vào: Stack cần kiểm tra + Ra: Giá trị B1) if top=-1 then return else return BKT) Kết thúc Cài đặt: int IsEmpty (stack s) { if (s.top == -1) return 1; return 0; } Biểu diễn Stack dùng mảng Kiểm tra stack đầy Được gọi đến trước thực thao tác đưa phần tử vào stack Stack đầy top = N-1 Thuật toán: +Vào: Stack cần kiểm tra + Ra: giá trị B1) if top = N-1 then return 1; else return 0; BKT) Kết thúc; 10 Cài đặt: int IsFull (stack s) { if (s.top==N-1) return 1; return 0; } Biểu diễn Stack dùng mảng Thêm phần tử vào Stack Thuật toán Vào: Stack S, phần tử liệu x Ra: Stack với phần tử liệu đỉnh Stack B1) Kiểm tra stack chưa đầy thì: B1.1) Tăng top lên 1; B1.2) Giá trị phần tử đỉnh Stack = x; B1.3) Thực bước kết thúc; B2) Nếu stack rỗng thực BKT; BKT) Kết thúc; 11 Biểu diễn Stack dùng mảng Cài đặt: void Push(stack &s,node x){ if(!Full(s)) { // stack chưa đầy s.top++; s.Ary[s.top]=x; } } 12 Biểu diễn Stack dùng mảng Lấy phần tử khỏi Stack Thuật toán Vào: Stack S; Ra: x lưu giá trị phần tử đỉnh Stack B1) Kiểm tra stack khơng rỗng thì: B1.1) x = giá trị phần tử đỉnh Stack = x; B1.2) Giảm top ; B1.3) Thực bước kết thúc; B2) Nếu stack rỗng thực BKT; BKT) Kết thúc; 13 Biểu diễn Stack dùng mảng Cài đặt: node Pop(stack &s) { item x; if(!Empty(s)) // stack khác rỗng { x = s.Ary[s.top]; s.top ; } return x; } 14 Biểu diễn Stack dùng mảng Nhận xét: Ưu điểm: • Các thao tác làm việc với chi phí O(1) • Việc cài đặt stack thơng qua mảng chiều đơn giản hiệu Hạn chế: • Giới hạn kích thước stack N • Giá trị N nhỏ so với nhu cầu thực tế lớn làm lãng phí nhớ Khắc phục: Sử dụng DSLK đơn để biểu diễn stack 15 Biểu diễn Stack dùng DSLK Cấu trúc Node typedef struct Node { int data; node *next; }; Khai báo Stack typedef struct stack { Node *top; }; 16 Biểu diễn Stack dùng DSLK Các thao tác stack Khởi tạo stack: Init (S) Tạo 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ử khỏi Stack: Pop (S, x) 17 179/44 Biểu diễn Stack dùng DSLK Khởi tạo stack Lệnh top = NULL tạo stack S rỗng Thuật toán: +Vào: Stack cần khởi tạo + Ra: Stack sau khởi tao B1) Đặt top = NULL; BKT) Kết thúc; Cài đặt: void Init (stack &s) { s.top = NULL; } 18 Biểu diễn Stack dùng DSLK Kiểm tra stack rỗng Stack rỗng top = NULL Thuật toán: +Vào: Stack cần kiểm tra + Ra: Giá trị B1) if top = NULL then return 1; else return BKT) Kết thúc 19 Cài đặt int IsEmpty(stack s) { if (s.top == NULL) return 1; return 0; // stack rỗng } Biểu diễn Stack dùng DSLK Tạo nút: Node* CreateNode (int x) { Node *p; p = (Node*) malloc (sizeof(Node)); if (p==NULL) { printf (“Khong du bo nho!”); return NULL; } p->data=x; p->next=NULL; return p; } 20 Biểu diễn Stack dùng mảng Thêm phần tử vào Stack Thuật toán Vào: Stack S, phần tử liệu x Ra: Stack với phần tử liệu đỉnh Stack B1) NewNode Tạo nút chứa liệu x; B2) Nếu không tạo nút thực BKT; B3) Kiểm tra danh sách rỗng top = NewNode; Ngược lại, chèn NewNode vào đầu danh sách BKT) Kết thúc; 21 Biểu diễn Stack dùng DSLK Cài đặt: void Push (stack &s, int x){ Node *NewNode = CreateNode (x); if (NewNode != NULL){ if (IsEmpty(s)) s.top = NewNode; else{ NewNode->next = s.top; s.top = NewNode; } } } 22 Biểu diễn Stack dùng mảng Lấy phần tử khỏi Stack Thuật toán Vào: Stack S; Ra: Phần tử đỉnh Stack B1) Kiểm tra stack khơng rỗng thì: B1.1) p phần tử đỉnh Stack; B1.3) Thực bước kết thúc; B2) Nếu stack rỗng thực BKT; BKT) Kết thúc; 23 Biểu diễn Stack dùng DSLK Cài đặt: int Pop (stack &s){ node *p; int x; if (!Empty(s)) { p = s.top; s.top = p->next; x = p->data; delete p; return x; } } 24 Ứng dụng Stack Stack thích hợp lưu trữ loại liệu mà trình tự truy xuất ngược với trình tự lưu trữ Một số ứng dụng Stack: Trong trình biên dịch (thông dịch), thực thủ tục, Stack sử dụng để lưu môi trường thủ tục Lưu liệu giải số tốn lý thuyết đồ thị (như tìm đường đi) Khử đệ qui 25 ... phần tử vào Stack Thuật toán Vào: Stack S, phần tử liệu x Ra: Stack với phần tử liệu đỉnh Stack B1) Kiểm tra stack chưa đầy thì: B1.1) Tăng top lên 1; B1.2) Giá trị phần tử đỉnh Stack = x;... return p; } 20 Biểu diễn Stack dùng mảng Thêm phần tử vào Stack Thuật toán Vào: Stack S, phần tử liệu x Ra: Stack với phần tử liệu đỉnh Stack B1) NewNode Tạo nút chứa liệu x; B2) Nếu khơng... Stack dùng mảng Lấy phần tử khỏi Stack Thuật toán Vào: Stack S; Ra: Phần tử đỉnh Stack B1) Kiểm tra stack khơng rỗng thì: B1.1) p phần tử đỉnh Stack; B1.3) Thực bước kết thúc; B2) Nếu stack