Bài giảng Lập trình chương 3 trang bị cho người học những kiến thức cơ bản về cấu trúc dữ liệu như: Giới thiệu chung, mảng và quản lý bộ nhớ động, nội dung và mục đích của cấu trúc dữ liệu, cài đặt một số cấu trúc với C++. Mời các bạn cùng tham khảo.
.c om an co ng Lập trình cu u du o ng th Chương 3: Cấu trúc liệu 2/10/2017 CuuDuongThanCong.com https://fb.com/tailieudientucntt 3.1 Giới thiệu chung 3.2 Mảng quản lý nhớ động c om Nội dung giảng cu u du o ng th an co ng 3.4 Nội dung mục đích cấu trúc liệu 3.4 Cài đặt số cấu trúc với C++ Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt 3.1 Giới thiệu chung ng c om Phần lớn toán thực tế liên quan tới liệu phức hợp, kiểu liệu ngôn ngữ lập trình khơng đủ biểu diễn ng th an Dữ liệu sinh viên: Họ tên, ngày sinh, quê quán, mã số SV, Mơ hình hàm truyền: Đa thức tử số, đa thức mẫu số Mơ hình trạng thái: Các ma trận A, B, C, D Đối tượng đồ họa: Kích thước, màu sắc, đường nét, phơng chữ, du o – – – – co Ví dụ: cu u Phương pháp biểu diễn liệu: định nghĩa kiểu liệu sử dụng cấu trúc (struct, class, union, ) Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Vấn đề: Biểu diễn tập hợp liệu c om Đa số liệu thuộc ứng dụng có liên quan với => cần biểu diễn tập hợp có cấu trúc, ví dụ: th an co ng – Danh sách sinh viên: Các liệu sinh viên xếp theo thứ tự Alphabet – Đối tượng đồ họa: Một cửa sổ bao gồm nhiều đối tượng đồ họa, vẽ bao gồm nhiều đối tượng đồ họa du o ng Thông thường, liệu tập hợp có kiểu, tương thích kiểu với cu u Kiểu mảng phù hợp! Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Vấn đề: Quản lý liệu co ng c om Sử dụng kết hợp cách khéo léo kiểu cấu trúc kiểu mảng đủ để biểu diễn tập hợp liệu Các giải thuật (hàm) thao tác với liệu, nhằm quản lý liệu cách hiệu quả: cu u du o ng th an – Bổ sung mục liệu vào danh sách, bảng, tập hợp, – Xóa mục liệu danh sách, bảng, tập hợp, – Tìm mục liệu danh sách, bảng tập hợp, theo tiêu chuẩn cụ thể – Sắp xếp danh sách theo tiêu chuẩn – Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Quản lý DL hiệu quả? c om Tiết kiệm nhớ Truy nhập nhanh, thuận tiện: Thời gian cần cho bổ sung, tìm kiếm xóa bỏ mục liệu phải ngắn ng th an co ng Linh hoạt: Số lượng mục liệu khơng (hoặc ít) bị hạn chế cố định, khơng cần biết trước tạo cấu trúc, phù hợp với toán nhỏ lớn Hiệu quản lý liệu phụ thuộc vào cu u du o – Cấu trúc liệu sử dụng – Giải thuật áp dụng cho bổ sung, tìm kiếm, xếp, xóa bỏ Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Các cấu trúc liệu thông dụng an co ng c om Mảng (nghĩa rộng): Tập hợp liệu truy nhập tùy ý theo số Danh sách (list): Tập hợp liệu móc nối đơi với truy nhập Cây (tree): Tập hợp liệu móc nối với theo cấu trúc cây, truy nhập từ gốc cu u du o ng th Hàng đợi (queue): Tập hợp liệu có xếp tuần tự, bổ sung vào từ đầu lấy từ đầu lại Ngăn xếp (stack): Tập hợp liệu xếp tuần tự, truy nhập từ đầu Bộ nhớ vòng (ring buffer): Tương tự hàng đợi, dung lượng có hạn, hết chỗ ghi quay vòng Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt 3.2 Mảng quản lý nhớ động c om Mảng cho phép biểu diễn quản lý liệu cách hiệu quả: co ng – Đọc ghi liệu nhanh qua số qua địa – Tiết kiệm nhớ an Các vấn đề mảng tĩnh: cu u du o ng th VD: Student student_list[100]; – Số phần tử phải số (biết trước biên dịch, người sử dụng nhập số phần tử, cho số phần từ biến) => linh hoạt – Chiếm chỗ cứng ngăn xếp (đối với biến cục bộ) nhớ liệu chương trình (đối với biến toàn cục) => sử dụng nhớ hiệu quả, linh hoạt Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Mảng động c om Mảng động mảng cấp phát nhớ theo yêu cầu, chương trình chạy th an co ng #include /* C */ int n = 50; float* p1= (float*) malloc(n*sizeof(float)); /* C */ double* p2= new double[n]; // C++ cu u p1[0] = 1.0; p2[0] = 2.0; du o ng Sử dụng trỏ để quản lý mảng động: Cách sử dụng không khác so với mảng tĩnh Sau sử dụng xong => giải phóng nhớ: free(p1); delete [] p2; /* C */ // C++ Chương 3: Cấu trúc liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Cấp phát giải phóng nhớ động c om C: an co ng – Hàm malloc() yêu cầu tham số số byte, trả trỏ không kiểu (void*) mang địa vùng nhớ cấp phát (nằm heap), trả không thành công – Hàm free() yêu cầu tham số trỏ khơng kiểu (void*), giải phóng vùng nhớ có địa đưa vào th C++: cu u du o ng – Toán tử new chấp nhận kiểu liệu phần tử kèm theo số lượng phần tử mảng cần cấp phát nhớ (trong vùng heap), trả trỏ có kiểu, trả khơng thành cơng – Tốn tử delete[] u cầu tham số trỏ có kiểu – Tốn tử new delete cịn áp dụng cho cấp phát giải phóng nhớ cho biến đơn, đối tượng không thiết phải mảng Chương 3: Cấu trúc liệu CuuDuongThanCong.com 10 https://fb.com/tailieudientucntt Ứng dụng stack ( ) c om Định giá trị biểu thức theo phương pháp nghịch đảo Balan Ví dụ: tính biểu thức 13 – * (5 * – 4) an co postfix: + postfix: * + postfix: * + prefix: + prefix: + * prefix: + * th –infix:3 + –infix:2 + * –infix:2 * + ng •Khái niệm infix, postfix, prefix •Ứng dụng hậu tố (postfix) vào ví dụ cu u du o ng •13 * -* •Đọc từ trái qua phải •Nếu số: PUSH vào Stack •Nếu phép tính (operator) lấy số (POP) Stack ra, tính toán lại PUSH vào Chương 3: Cấu trúc liệu CuuDuongThanCong.com 84 https://fb.com/tailieudientucntt Ứng dụng stack ( ) c om Ví dụ: tính biểu thức 13 – * (5 * – 4) Biểu diễn dạng hậu tố: 13 * - * - ng PUSH co * -* - 13 an PUSH 13 ng th * -* - -* - cu u du o * -* - 13 POP 10 13 PUSH Chương 3: Cấu trúc liệu CuuDuongThanCong.com * = 10 85 https://fb.com/tailieudientucntt Ứng dụng stack ( ) c om Ví dụ: tính biểu thức 13 – * (5 * – 4) (tiếp ) 10 13 ng PUSH ng th an co -* - cu - u du o *- 13 POP PUSH POP * = 12 PUSH 12 13 POP 13 - 12 = POP PUSH Chương 3: Cấu trúc liệu CuuDuongThanCong.com 10 - = 86 https://fb.com/tailieudientucntt ng cu u du o ng th an co #include using namespace std; struct Node { int data; Node *next; }; struct Stack { Node *top; }; void Khoi_Tao(Stack &s) { s.top =NULL; } c om Ví dụ: Đởi số dùng stack Chương 3: Cấu trúc liệu CuuDuongThanCong.com 87 https://fb.com/tailieudientucntt void Push(Stack &s,int pt) { cu u du o ng th an co ng c om Node *tmp= new Node; tmp->data =pt; if(s.top ==NULL) /* Phan tu dau tien */ { s.top =tmp; s.top->next =NULL; } else /* Phan tu tiep theo */ { tmp->next =s.top; s.top =tmp; } } Chương 3: Cấu trúc liệu CuuDuongThanCong.com 88 https://fb.com/tailieudientucntt cu u du o ng th an co ng c om bool isEmpty(Stack s) { return (s.top==NULL); } void Pop(Stack &s,int &pt) { if (!isEmpty(s)) { pt=s.top->data ; s.top=s.top->next ; } } Chương 3: Cấu trúc liệu CuuDuongThanCong.com 89 https://fb.com/tailieudientucntt cu u du o ng th an co ng c om void main() /* Quy doi co so 10 nhi phan */ { Stack S; Khoi_Tao(S); int a,pt; cout