Ngôn ngữ lập trình C - Chương 7 - Bài 2. Stack docx

10 442 0
Ngôn ngữ lập trình C - Chương 7 - Bài 2. Stack docx

Đang tải... (xem toàn văn)

Thông tin tài liệu

4/28/2010 1 Chương 7. Bài 2. Stack ĐỖ BÁ LÂM ViỆN CNTT&TT, TRƯỜNG ĐHBK HÀ NỘI Nội dung 1. Khái niệm stack 2. Xây dựng stack 2.1. Sử dụng mảng 2.2. Sử dụng danh sách liên kết 2 1. Khái niệm stack  Stack (ngăn xếp)  Là một cấu trúc dữ liệu mà các thao tác xử lý chỉ được thực hiện ở phía đáy (cuối) của nó  Cấu trúc dạng LIFO (Last In First Out) – “Vào sau ra trước”  Thao tác xử lý • Đẩy vào PUSH • Lấy ra POP 3 4/28/2010 2 Đáy Đỉnh 1. Khái niệm stack A A B A B A B A Pus h(A) Stack có 1 phần tử: A Pop() Pop() Stack rỗng Pus h(B) Stack có 2 phần tử: A B Stack còn 1 phần tử: A Stack lại rỗng 1. Khái niệm stack Ứng dụng của Stack  Lưu trữ các trang web đã từng được duyệt trên Web browser  Cài đặt thao tác Undo trong các phần mềm soạn thảo  Lưu danh sách các lời gọi hàm trong Java Virtual Machine 4/28/2010 3 Ghi nhớ Stack được hình dung như một ngăn xếp chứa các quyển sách với 2 thao tác đưa vào và lấy ra theo nguyên tắc:  Quyển sách nào được đưa vào sau sẽ lấy ra trước – LIFO (Last In First Out) Ví dụ - Bài toán chuyển cơ số  Nguyên tắc đổi một số nguyên từ thập phân sang nhị phân: Các số dư lấy ra sau được hiển thị trước Cơ chế sắp xếp của Stack Giải pháp Dùng stack để lưu trữ số dư qua từng phép chia:  Khi thực hiện phép chia: Đưa số dư vào Stack  Khi hiển thị kết quả: Lấy chúng lần lượt từ Stack 4/28/2010 4 Giải pháp 0 PUSH PUSH 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 POP Giải thuật 1. Nhap N 2. while N != 0 R = N% 2; //Tính số dư trong phép chia N cho 2 PUSH (S, R); //Đẩy R vào đỉnh Stack S N=N/2; //Thay N bằng N/2 3. while S chưa rỗng POP(S,R); //Lấy phần tử từ stack đưa vào R Hien_thi R; 2. Xây dựng Stack  Lưu trữ được các đối tượng dữ liệu (quyển sách)  Xây dựng 2 thao tác Push và Pop theo nguyên tắc LIFO  Có hai cách cài đặt stack  Sử dụng mảng  Sử dụng danh sách liên kết 4/28/2010 5 2.1. Sử dụng mảng  Mỗi phần tử của stack được lưu như một phần tử của mảng  Đáy: phần tử có chỉ số 0  Đỉnh: phần tử được đưa vào cuối cùng, có chỉ số T  Khởi tạo T=-1  Stack rỗng (empty) T = -1, stack đầy T = MAX-1 13 Đáy Stack 2.1. Sử dụng mảng #define MAX 100 //So phan tu lon nhat cua Stack //Khai bao Stack va T la 2 bien toan cuc ElemType Stack[MAX]; int T=-1; 14 2.1. Sử dụng mảng  Stack được biểu diễn thông qua mảng S[MAX]  int push(ElemType N){ if (T==MAX-1) return 0; else{ //mảng chưa đầy T++; S[T]=N; } return 1; } 4/28/2010 6 2.1. Sử dụng mảng  int pop(ElemType *N){ if (T== -1) return 0; else{ *N = S[T ]; return 1; } } 2.2. Sử dụng danh sách liên kết Stack là cấu trúc LIFO (Last In First Out) Thao tác Push, Pop? 17 Head 2.2. Sử dụng danh sách liên kết Push  Thêm một nút vào đầu danh sách Pop  Lấy giá trị nút đầu tiên trong danh sách  Loại bỏ nút này khỏi danh sách 18 4/28/2010 7 2.2. Sử dụng danh sách liên kết struct node { ElemType data; struct node *next; }; //Khai báo con trỏ đầu là biến toàn cục struct node *top; void push(ElemType N) { struct node *temp; temp=(struct node *) malloc(sizeof(struct node)); temp->data = N; temp->next = top; top = temp; } 7 1 8 \ top 45 Temp Push void push(ElemType N) { struct node *temp; temp=(struct node *) malloc(sizeof(struct node)); temp->data = N; temp->next = top; top = temp; } 7 1 8 \ top 45 Temp Push 4/28/2010 8 void push(ElemType N) { struct node *temp; temp=(struct node *) malloc(sizeof(struct node)); temp->data = N; temp->next = top; top = temp; } 7 1 8 \ top 45 Temp Push 7 1 8 \ 45 top Temp int pop(ElemType *N){ struct node *temp; if(top==NULL) return 0; else{ *N = top->data; temp = top; top = top->next; free(temp); return 1; } } Giá trị của thành phần top cần lưu lại trước khi giải phóng vùng nhớ Pop 7 1 8 \ 45 top Temp int pop(ElemType *N){ struct node *temp; if(top==NULL) return 0; else{ *N = top->data; temp = top; top = top->next; free(temp); return 1; } } Pop 4/28/2010 9 7 1 8 \ top Temp int pop(ElemType *N){ struct node *temp; if(top==NULL) return 0; else{ *N = top->data; temp = top; top = top->next; free(temp); return 1; } } Pop Bài toán Demo dS_Array.c, dS_List.c Bài tập 1.  Viết chương trình chuyển một số nguyên dương từ hệ cơ số 10 sang hệ cơ số 2 sử dụng stack (bằng mảng và danh sách liên kết) Bài toán Bài tập 2. Cộng hai số nguyên lớn  Kiểu dữ liệu số nguyên chỉ biểu diễn số trong phạm vi nhất định  Mục đích: thực hiện thao tác cộng, trừ, nhân, chia trên các số nằm ngoài phạm vi biểu diễn 27 4/28/2010 10 Bài toán  Thực hiện phép cộng trên hai số nguyên “lớn”  Hai số được lưu dưới dạng xâu kí tự 28 Bài toán Cải tiến  Trong cách xây dựng stack bằng mảng, thay vì tách rời mảng và biến T chúng ta định nghĩa một cấu trúc gồm 2 trường là mảng và biến T này  Áp dụng làm lại các bài tập ở trên. 29 Thảo luận 30 . 4 /28 /20 10 1 Chương 7. Bài 2. Stack ĐỖ BÁ LÂM ViỆN CNTT&TT, TRƯỜNG ĐHBK HÀ NỘI Nội dung 1. Khái niệm stack 2. Xây dựng stack 2. 1. Sử dụng mảng 2. 2. Sử dụng danh sách liên kết 2 1 T = -1 , stack đầy T = MAX-1 13 Đáy Stack 2. 1. Sử dụng mảng #define MAX 100 //So phan tu lon nhat cua Stack //Khai bao Stack va T la 2 bien toan cuc ElemType Stack[ MAX]; int T =-1 ; 14 2. 1 kết 4 /28 /20 10 5 2. 1. Sử dụng mảng  Mỗi phần tử c a stack đư c lưu như một phần tử c a mảng  Đáy: phần tử c chỉ số 0  Đỉnh: phần tử đư c đưa vào cuối c ng, c chỉ số T  Khởi tạo T =-1  Stack

Ngày đăng: 01/08/2014, 17:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan