1. Trang chủ
  2. » Tất cả

05_CS101_Bai3_v2.0014101214

16 1 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 872,14 KB

Nội dung

Bài 3: Ngăn xếp BÀI 3: NGĂN XẾP Một ngăn xếp hộp giấy Một chồng khay cafe Một ngăn xếp đồng xu Một chồng áo sơ mi gọn gàng Mục tiêu Nội dung Sau học này, bạn có thể:  Mơ tả khái niệm ngăn xếp phân biệt ngăn xếp với danh sách  Trình bày đặc tả ngăn xếp cách xác  Mơ tả phương án cài đặt ngăn xếp mảng danh sách liên kết  Sử dụng cấu trúc liệu ngăn xếp để giải toán thực tế     Khái niệm ngăn xếp Đặc tả ngăn xếp Các phương án cài đặt ngăn xếp Ứng dụng ngăn xếp Thời lượng học tiết CS101_Bai3_v2.0014101214 51 Bài 3: Ngăn xếp Trong này, trình bày kiểu liệu trừu tượng ngăn xếp Cũng giống danh sách, ngăn xếp cấu trúc liệu tuyến tính, gồm đối tượng liệu thứ tự Nhưng danh sách, phép toán xen, loại truy cập thực vị trí danh sách, cịn ngăn xếp phép tốn thực đầu Mặc dù phép toán ngăn xếp đơn giản, song ngăn xếp cấu trúc liệu quan trọng Trong đặc tả kiểu liệu trừu tượng ngăn xếp, sau nghiên cứu phương pháp cài đặt ngăn xếp Cuối trình bày số ứng dụng ngăn xếp 3.1 Khái niệm ngăn xếp Như ta biết mục liệu lưu trữ nhớ máy tính biểu diễn nhị phân Đặc biệt số nguyên dương thường lưu trữ dạng nhị phân Điều có nghĩa số nguyên xuất lệnh chương trình hay tệp liệu phải chuyển sang biểu diễn số hai Một cách để thực phép chuyển đổi ta dùng phép chia liên tiếp cho với số dư chữ số nhị phân biểu diễn số từ phải sang trái Ví dụ biểu diễn số hai 26 11010 phép tính sau ra: Ta nhận thấy bit tạo nên biểu diễn số hai 26 tính theo thứ tự ngược lại, từ phải sang trái Như vậy, để thị theo thứ tự thông thường từ trái sang phải, bit phải hiển thị theo cách “được tạo cuối – hiển thị đầu tiên” hay gọi “vào sau trước” Kiểu xử lý “vào sau trước” xuất nhiều ứng dụng cấu trúc “vào sau trước” gọi ngăn xếp Ngăn xếp dạng đặc biệt danh sách mà việc bổ sung hay loại bỏ phần tử thực đầu danh sách gọi đỉnh Nói cách khác, ngăn xếp cấu trúc liệu có thao tác bản: bổ sung (push) loại bỏ (pop), việc loại bỏ tiến hành loại phần tử đưa vào danh sách Chính tính chất mà ngăn xếp cịn gọi kiểu liệu có ngun tắc LIFO (Last In First Out – Vào sau trước) Ngoài ra, stack hỗ trợ số thao tác khác:  isEmpty(): Kiểm tra xem stack có rỗng không  Top(): Trả giá trị phần tử nằm đầu stack mà khơng hủy khỏi stack Nếu stack rỗng lỗi xảy 52 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp Hình 3.1: Sơ đồ ngăn xếp Hình minh họa thay đổi ngăn xếp thông qua thao tác bổ sung loại bỏ đỉnh ngăn xếp Hình 3.2: Thêm phần tử vào lấy phần tử khỏi ngăn xếp 3.2 Đặc tả ngăn xếp Ví dụ 3.1 Một số ví dụ ngăn xếp là: Một chồng sách mặt bàn, chồng đĩa hộp, v.v Khi thêm sách vào chồng sách, sách nằm đỉnh chồng sách Khi lấy sách khỏi chồng sách, nằm lấy đầu tiên, tức đưa vào lấy trước tiên Tương tự với chồng đĩa hộp CS101_Bai3_v2.0014101214 53 Bài 3: Ngăn xếp Khi thiết kế thao tác ngăn xếp phải đảm bảo quy luật “vào trước sau” theo định nghĩa ngăn xếp trật tự phần tử ngăn xếp quan trọng  Đặc tả liệu Có nhiều nút kiểu Có đỉnh stack (top)  Đặc tả tác vụ stack initialize Chức năng: Khởi động stack Dữ liệu nhập: Không Dữ liệu xuất: stack top vị trí khởi đầu empty: Chức kiểm tra stack có bị rỗng khơng Dữ liệu nhập: Khơng Dữ liệu xuất: True or False (True: stack rỗng, False: stack không bị rỗng) push Chức năng: thêm nút đỉnh stack Dữ liệu nhập: nút Dữ liệu xuất: khơng pop Chức năng: xóa nút đỉnh stack Dữ liệu nhập: Không Điều kiện: stack không bị rỗng Dữ liệu xuất: nút bị xóa stacktop: Chức năng: truy xuất nút đỉnh stack Dữ liệu nhập: Không Điều kiện: stack không bị rỗng Dữ liệu xuất: nút đỉnh stack stacksize Chức năng: xác định số nút có stack Dữ liệu: Không Dữ liệu xuất: số nút có stack clearstack: Chức năng: xóa tất nút stack Dữ liệu nhập: không Dữ liệu xuất: stack top vị trí khởi đầu 54 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp copystack: Chức năng: copy stack thành stack Dữ liệu nhập: stack nguồn Dữ liệu xuất: stack đích giống stack nguồn 3.3 Các phương án cài đặt ngăn xếp 3.3.1 Cài đặt ngăn xếp mảng Để cài đặt ngăn xếp mảng, ta sử dụng mảng chiều s để biểu diễn ngăn xếp Thiết lập phần tử mảng, s[0], làm đáy ngăn xếp Các phần tử đưa vào ngăn xếp lưu vị trí s[1], s[2],… Nếu ngăn xếp có n phần tử s[n – 1] phần tử đưa vào ngăn xếp Để lưu giữ đỉnh ngăn xếp, ta sử dụng biến số nguyên top_id Chẳng hạn, ngăn xếp có n phần tử top có giá trị n – Còn ngăn xếp chưa có phần tử (ngăn xếp rống) ta quy ước top_id có giá trị –1 Hình 3.3: Cài đặt ngăn xếp mảng Việc cài đặt ngăn xếp mảng thực qua khai báo đây: #define max … //khai báo độ lớn cực đại ngăn xếp typedef ElementType;//kiểu phần tử ngăn xếp struct Stack { int Top_id; //biến lưu đỉnh stack ElementType Element[max]; }; struct Stack S; Khi thêm phần tử vào ngăn xếp thì:  Phần tử lưu vị trí mảng  Giá trị biến Top_id tăng lên Khi lấy phần tử khỏi ngăn xếp thì:  Phần tử mảng vị trí Top_id lấy  Giá trị biến Top_id giảm CS101_Bai3_v2.0014101214 55 Bài 3: Ngăn xếp Có vấn đề cần giải thao tác ngăn xếp:  Khi ngăn xếp đầy tức biến Top_id có giá trị giá trị (max – 1) khơng thể tiếp tục thêm phần tử vào Khi ngăn xếp rỗng tức biến Top_id –1 khơng thể lấy phần tử từ ngăn xếp Như thao tác đưa phần từ vào ngăn xếp lấy phần tử khỏi ngăn xếp, cần có thao tác kiểm tra xem ngăn xếp có rỗng đầy khơng Chúng ta tiến hành cài đặt thao tác stack: Thao tác 1: Khởi tạo Stack void StackInit(Stack *S)//khoi tao stack { S –>Top_id == –1; } Thao tác 2: Kiểm tra stack có rỗng khơng int StackEmpty (Stack S)//kiem tra stack { Return(S.Top_id == –1) } Thao tác 3: Bổ sung thêm phần tử vào stack (bổ sung phần tử X vào stack, cài đặt stack S mà Top_id trỏ tới đỉnh) void PUSH(Stack *S,ElementType x) //Kiểm tra xem stack đầy chưa if (S –>Top_id == max – 1) { printf(“stack tran”) return; } //Nếu stack chưa đầy, di chuyển top_ip lên S –>Top_id ++; //Nạp phần tử vào stack S –>Element[S –> Top_id] = x //Thốt khỏi chương trình return; 56 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp Ta cài đặt thao tác sau: void PUSH (Stack *S,int X) { if(S –>Top_id == max – 1) { printf(“stack tran”); return; } else { S –>Top_id ++; S –>Element[S –>Top_id] = X; return; } } Thao tác 4: Lấy phần tử khỏi đỉnh Stack ElementType POP(Stack *S) Kiểm tra stack rỗng if (StackEmpty(S)) { printf("ngan xep rong"); } Nếu stack khơng rỗng lấy phần tử khỏi cuối mảng, lùi top_id xuống đơn vị return *S.Element[S –> Top_id––]; Ta cài đặt thao tác sau: ElementType POP(Stack *S) { if (StackEmpty(S)) { printf("ngan xep rong"); } else { return *S.Element[S –> Top_id––]; } } CS101_Bai3_v2.0014101214 57 Bài 3: Ngăn xếp Hạn chế việc cài đặt ngăn xếp mảng hạn chế mảng Đó độ dài ngăn xếp bị giới hạn chiều dài mảng Hạn chế giải cài đặt ngăn xếp danh sách liên kết 3.3.2 Cài đặt ngăn xếp danh sách liên kết Chúng ta cài đặt stack danh sách liên kết làm danh sách Đỉnh stack đầu danh sách liên kết Ta sử dung trỏ Top trỏ đến đỉnh stack Hình minh hoạ danh sách liên kết biểu diễn stack (a1, a2, , an) với đỉnh an Dùng cài đặt danh sách liên kết sở dùng trỏ ta có khai báo cho ngăn xếp liên kết: typedef ElementType struct StackNode //khai báo nút ngăn xếp liên kết { ElementType Data; struct StackNode *Next; }; typedef struct { StackNode *Top; }Stack; Các thao tác ngăn xếp cài đặt danh sách liên kết Thao tác khởi tạo ngăn xếp: Thủ tục giống thủ tục khởi tạo danh sách liên kết void StackInit(Stack *S) { S –> Top = NULL; return; } Thao tác xác định điều kiện rỗng ngăn xếp: int StackEmpty(Stack *S) { return (S –> Top == NULL); } 58 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp Thao tác thêm phần tử vào danh sách: Thao tác trường hợp đơn giản thủ tục thêm phần tử vào đầu danh sách liên kết với nút trỏ S Thao tác cài đặt sau: void PUSH(Stack *S,ElementType x) // Thủ tục đẩy x vào ngăn xếp S, S–>Top trỏ đến nút chứa phần tử đỉnh ngăn xếp { StackNode *p;//con trỏ tạm thời đến nút đỉnh p =(StackNode*) malloc (sizeof(struct StackNode)); (*p).Data = x; p –> Next = S – >Top; S –> Top = p; return; } Thao tác lấy phần tử khỏi đỉnh ngăn xếp S: Thao tác trường hợp đơn giản thao tác xóa nút từ đầu danh sách liên kết Thao tác xây dựng sau: ElementType POP(Stack *S) // Thủ tục lấy phần tử từ đỉnh ngăn xếp S, giả sử ngăn xếp S không rỗng S –> Top trỏ đến nút chứa phần tử đỉnh ngăn xếp { StackNode *p;// Con trỏ tạm thời đến nút đỉnh if(StackEmpty(S)) { printf("ngan xep rong"); return NULL; } else { p = S –> Top; S –> Top = S –> Top –> Next; return p –> Data; } } CS101_Bai3_v2.0014101214 59 Bài 3: Ngăn xếp 3.4 Ứng dụng ngăn xếp 3.4.1 Ứng dụng ngăn xếp tính tốn giá trị biểu thức (Ký pháp nghịch đảo Ba Lan) Trong chương trình ta thường viết lệnh gán X = < biểu thức > đó, vế phải biểu thức (số học logic) Khi thực chương trình, gặp lệnh gán, máy tính cần phải xác định giá trị biểu thức gán kết cho biến X Do vấn đề đặt là, làm thiết kế thuật toán xác định giá trị biểu thức Ta xem xét biểu thức số học, dãy tốn hạng (hằng, biến hàm) nối với phép tốn số học Trong biểu thức chứa dấu ngoặc tròn để thứ tự phép tốn thực Chẳng hạn, xét biểu thức + / ( + 1) * Giá trị biểu thức tính sau: + 8/(3 + 1) * = + 8/4 * = + * = + = 11 Trong đa số ngơn ngữ lập trình, biểu thức biểu diễn gọi ký pháp trung tố (infix) Nên xác định giá trị biểu thức số học ta đưa thuật toán sau Thuật toán gồm hai giai đoạn  Chuyển biểu thức số học thông thường (dạng trung tố – infix) sang biểu thức số học dạng hậu tố (postfix – dạng ký pháp nghịch đảo Balan gọi tắt biểu thức Balan)  Tính giá trị biểu thức số học Ba Lan postfix Trong biểu thức dạng biểu thức Ba Lan phép tốn đặt sau tốn hạng Chẳng hạn, biểu thức a + b, a * b cách viết Ba Lan viết ab +, ab* Ví dụ 3.2 Biểu thức thơng thường (trung tố) Biểu thức Balan a * b/ c ab * c / a * (b + c) – d/e abc + * de / – Chú ý Cần lưu ý rằng, biểu thực số học Ba Lan không chứa dấu ngoặc, gồm tốn hạng dấu phép tốn Việc tính giá trị biểu thức dạng biểu thức Ba Lan thực hiện: biểu thức đọc từ trái sang phải tìm tốn tử Tại thời điểm đó, hai toán hạng cuối đọc kết hợp với tốn tử Ví dụ 3.3 Xét biểu thức sau dạng trung tố: (1 + 3) * ( – (6 – 4)) Biểu thức biểu diễn dạng biểu thức Ba Lan là: + – – *, việc tính giá trị biểu thức Ba Lan thực sau: 60 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp Toán tử đọc + toán hạng 3, dấu gạch sau đây: + – – * Thay biểu thức giá trị ta biểu thức Ba Lan rút gọn: – – * Tiếp tục đọc từ trái sang phải , toán tử – ta xác định hai toán tử là: – – *, áp dụng toán tử cho ra: – * Toán tử đọc – hai toán hạng 2: 452–* Tính hiệu ta được: * Tốn tử cuối đọc *: * ta nhận giá trị 12 cho biểu thức Phương pháp tính giá trị biểu thức số học Ba Lan địi hỏi phải lưu trữ tốn hạng toán tử đọc từ trái sang phải; thời điểm hai toán hạng cuối phải tìm kết hợp với toán tử Điều làm cho ta nghĩ đến cấu trúc “vào sau trước” – nghĩa ngăn xếp cần sử dụng để lưu trữ toán hạng Cứ lần đọc toán tử, hai giá trị lấy từ ngăn xếp, áp dụng toán tử cho chúng kết đẩy vào ngăn xếp Thuật toán xác định giá trị biểu thức số học Ba Lan Trong thuật toán này, ta sử dụng ngăn xếp S để lưu giữ toán hạng kết tính tốn trung gian Thuật tốn sau:  Khởi động ngăn xếp rỗng  Lặp lại bước sau dấu kết thúc biểu thức đọc: o Đọc phần tử (hằng số, biến số, toán tử số học) biểu thức Ba Lan o Nếu phần tử toán hạng, đẩy vào ngăn xếp Nếu tốn tử, thực bước sau:  Lấy từ đỉnh ngăn xếp hai giá trị (nếu ngăn xếp không chứa hai phần tử, xảy lỗi biểu thức không dạng biểu thức Ba Lan thuật toán kết thúc)  Áp dụng toán tử vào hai giá trị vừa lấy  Đẩy giá trị kết vào ngăn xếp o Khi gặp dấu kết thúc biểu thức, giá trị giá trị đỉnh ngăn xếp (và phải giá trị ngăn xếp) Ví dụ 3.4 Tính giá trị biểu thức Balan + – – * theo thuật toán sau: Đọc CS101_Bai3_v2.0014101214 Xử lý Stack Đẩy vào Stack Đẩy vào Stack 1, + Lấy khỏi Stack tính + = 4, đẩy vào Stack Đẩy vào Stack 4, 61 Bài 3: Ngăn xếp Đọc Xử lý Stack Đẩy vào Stack 4, 5, Đẩy vào Stack 4, 5, 6, – Lấy khỏi Stack tính – = 2, đẩy vào Stack 4, 5, – Lấy khỏi Stack tính – = 3, đẩy vào Stack 4, * Lấy khỏi Stack tính * = 12, đẩy 12 vào Stack 12 Sau thiết kế thuật toán chuyển biểu thức số học thông thường sang biểu thức số học Ba Lan Khác với thuật tốn tính giá trị biểu thức số học Ba Lan, thuật toán này, sử dụng stack S để lưu dấu mở ngoặc trái dấu phép toán + , –, * / Ta đưa vào ký hiệu $ để đánh dấu đáy stack Khi đỉnh stack chứa $, có nghĩa stack rỗng Bây ta xây dựng hàm Pri để xác định độ ưu tiên phép toán ký hiệu $, hàm Pri xác định độ ưu tiên sau: Pri (‘$’) < Pri (‘(‘) < Pri (‘+’) = Pri (‘–’) < Pri (‘*’) = Pri(‘/’) Khi ta có thuật tốn chuyển biểu thức dạng thơng thường (trung tố) sang dạng biểu thức Balan sau:  Khởi động ngăn xếp rỗng toán tử  Đọc thành phần (hằng số, biến số, toán tử, dấu ngoặc trái ngoặc phải) biểu thức trung tố (đọc từ trái sang phải) Giả sử thành phần đọc x o Nếu x tốn hạng thị o Nếu x dấu mở ngoặc trái đẩy vào stack o Nếu x toán tử + , –, *, / thì:  Xét phần tử y đỉnh stack  Nếu Fri (y)  Fri(x) loại y khỏi stack, hiển thị y quay lại bước a  Nếu Fri (y) < Fri(x) đẩy x vào stack o Nếu x dấu đóng ngoặc phải thì:  Xét phần tử y đỉnh stack  Nếu y dấu phép tốn loại y khỏi stack, thị y quay lại bước a  Nếu y dấu mở ngoặc trái loại khỏi stack  Lặp lại bước toàn biểu thức đọc qua  Loại phần tử đỉnh stack thị Lặp lại bước stack rỗng Ví dụ 3.5 Xét biểu thức: E = a * (b + c) – d # (Dấu # báo kết thúc biểu thức trung tố) Kết bước thực thuật toán cho bảng sau: 62 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp Đọc biểu Xử lý thức trung tố Stack Balan Khởi động ngăn xếp rỗng $ a Hiển thị a $ a * Đẩy toán tử * vào ngăn xếp $* a ( Đẩy vào ngăn xếp $, *, ( a b Hiển thị b $, *, ( ab + Xét thấy Fri(‘+’) > Fri(‘(‘), đẩy vào ngăn xếp $, *, (, + ab c Hiển thị c $, *, (, + abc ) Lấy toán tử + khỏi ngăn xếp hiển thị $, *, ( abc+ Lấy ( khỏi ngăn xếp $, * abc+ Xét thấy Fri(‘–’) > Fri(‘*‘), lấy toán tử * khỏi ngăn $ – xếp hiển thị 3.4.2 Biểu thức abc+* Đẩy toán tử – ngăn xếp $, – abc +* d Hiển thị d $, – abc+*d # Lấy toán – khỏi ngăn xếp hiển thị $ abc+*d– Ứng dụng ngăn xếp để loại bỏ đệ quy chương trình Nếu chương trình đệ quy P(x) gọi từ chương trình ta nói chương trình thực mức Chương trình gọi nó, ta nói sâu vào mức mức k Rõ ràng mức k phải thực xong mức k – thực tiếp tục, hay ta cịn nói chương trình quay mức k – Trong chương trình từ mức i vào mức i + biến cục mức i địa mã lệnh dang dở phải lưu trữ, địa gọi địa trở Khi từ mức i + quay mức i giá trị sử dụng Như biến cục địa lưu sau dùng trước Tính chất gợi ý cho ta dùng ngăn xếp để lưu giữ giá trị cần thiết lần gọi tới chương trình Mỗi lùi mức giá trị lấy để tiếp tục thực mức Ta tóm tắt trình sau: Bước 1: Lưu biến cục địa trở Bước 2: Nếu thoả điều kiện ngừng đệ quy chuyển sang bước Nếu khơng tính tốn phần quay lại bước (đệ quy tiếp) Bước 3: Khôi phục lại biến cục địa trở Để khử đệ quy ta phải nắm nguyên tắc sau đây: CS101_Bai3_v2.0014101214 63 Bài 3: Ngăn xếp Mỗi chương trình đệ quy gọi, ứng với việc từ mức i vào mức i + 1, ta phải lưu trữ biến cục chương trình bước i vào ngăn xếp Ta phải lưu "địa mã lệnh" chưa thi hành chương trình mức i Tuy nhiên lập trình ngơn ngữ cấp cao khơng phải địa ô nhớ chứa mã lệnh máy mà ta tổ chức cho mức i + hồn thành lệnh thực lệnh chưa thi hành mức i Tập hợp biến cục lần gọi chương trình xem mẩu tin hoạt động (activation record) Mỗi lần thực chương trình mức i phải xố mẩu tin lưu biến cục mức ngăn xếp Như ta tổ chức ngăn xếp hợp lý giá trị ngăn xếp lưu trữ biến cục cho lần gọi đệ quy, mà "điều khiển thứ tự trở về" chương trình 64 CS101_Bai3_v2.0014101214 Bài 3: Ngăn xếp TÓM LƯỢC CUỐI BÀI Trong tìm hiểu dạng cấu trúc liệu đặc biệt danh sách Ngăn xếp gọi danh sách hạn chế Nên bạn cần lưu ý số vấn đề sau:  Trình bày khái niệm ngăn xếp Phân biệt điểm giống khác ngăn xếp danh sách  Mô tả đặc tả ngăn xếp phương án cài đặt cho ngăn xếp  Trình bày ứng dụng ngăn xếp vận dụng ngăn xếp vào giải toán CS101_Bai3_v2.0014101214 65 Bài 3: Ngăn xếp BÀI TẬP Cho A = 7, B = 4, C = 3, D = Tính giá trị biểu thức dạng ký pháp nghịch đảo Balan sau đây: a) A B + C / D * b) A B C + / D * c) A B C D + / * d) A B + C D + * Hãy chuyển biểu thức sau sang dạng biểu thức dạng ký pháp nghịch đảo Balan: a) (A + B) * (C – D) b) A + B / C + D c) (A + B) / C + D d) A – (B – (C – (D – E))) e) A and B or C f) (A < 3) and (A > 9) or not (A > 0) Trình bày thuật tốn viết chương trình nhập vào số nguyên dương bất kỳ, sau xuất hình đảo ngược thứ tự chữ số số nhập vào Trong chương trình có sử dụng kiểu liệu ngăn xếp Ví dụ: nhập vào số nguyên dương 1025 In số ngược 5201 Sử dụng ngăn xếp, trình bày thuật tốn viết chương trình đổi số tự nhiên N (hệ 10) sang biểu diễn hệ nhị phân (hệ số 2) Viết chương trình chuyển từ biểu thức trung tố sang biểu thức Balan 66 CS101_Bai3_v2.0014101214

Ngày đăng: 14/04/2022, 09:46

HÌNH ẢNH LIÊN QUAN

Hình dưới đây minh họa sự thay đổi của ngăn xếp thông qua các thao tác bổ sung và loại bỏđỉnh trong ngăn xếp - 05_CS101_Bai3_v2.0014101214
Hình d ưới đây minh họa sự thay đổi của ngăn xếp thông qua các thao tác bổ sung và loại bỏđỉnh trong ngăn xếp (Trang 3)
Hình 3.1: Sơ đồng ăn xếp - 05_CS101_Bai3_v2.0014101214
Hình 3.1 Sơ đồng ăn xếp (Trang 3)
Hình 3.3: Cài đặt ngăn xếp bằng mảng - 05_CS101_Bai3_v2.0014101214
Hình 3.3 Cài đặt ngăn xếp bằng mảng (Trang 5)

TÀI LIỆU CÙNG NGƯỜI DÙNG

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

TÀI LIỆU LIÊN QUAN