MÔ TẢ VIỆC CÀI ĐẶT VÀ ỨNG DỤNG CỦA NGĂN XẾP. Ngăn xếp được xem như một dạng đặc biệt của danh sách, hay còn gọi là một kiểu danh sách hạn chế. Nói cách khác, ngăn xếp là một cấu trúc dữ liệu có hai thao tác cơ bản: bổ sung ( push) và laoij bỏ phần tử (pop). Trong đó việc loại bỏ sẽ tiến hành loại phần tử mới nhất mới được đưa vào danh sách. Vì vậy, ngăn xếp còn được gọi là kiểu dữ liệu có nguyên tắc LIFO ( Last In First Out vào sau ra trước). Đồng thời, ngăn xếp, cùng với hàng đợi là hai cấu trúc dữ liệu rất gần gũi với các hoạt động trong thực tế. Đặc biệt, trong khoa học máy tính, ngăn xếp có khá nhiều ứng dụng đơn giản và hiệu quả như đảo ngược chuỗi, chuyển đổi cơ số, tính giá trị hậu tố... Vậy ngăn xếp được cài đặt và ứng dụng như thế nào? Trong bài báo cáo của mình, nhóm chúng tôi sẽ trình bày các khái niệm, mô tả cài đặt và ứng dụng của ngăn xếp, cùng với các chương trình demo viết bằng ngôn ngữ C. Hi vọng những kiến thức này sẽ giúp các bạn trả lời được câu hỏi trên. Do hạn chế về kiến thức và nghiên cứu, chắc chắn bài báo cáo không tránh khỏi những thiếu sót. Rất mong nhận được góp ý từ cô và các bạn để bài của nhóm được hoàn thiện hơn. Xin chân thành cảm ơn Nhóm thực hiện Nhóm 04. NỘI DUNG I. Ngăn xếp và cài đặt ngăn xếp. 1. Khái niệm. Ngăn xếp là một dạng đặc biệt của danh sách mà việc bổ sung hay loại bỏ một phần tử đều được thực hiện ở đầu của danh sách gọi là đỉnh. Nói cách khác, ngăn xếp là một cấu trúc dữ liệu có hai thao tác cơ bản: bổ sung ( push) và laoij bỏ phần tử (pop). Trong đó việc loại bỏ sẽ tiến hành loại phần tử mới nhất mới được đưa vào danh sách. Vì vậy, ngăn xếp còn được gọi là kiểu dữ liệu có nguyên tắc LIFO ( Last In First Out vào sau ra trước). Các ví dụ về lưu trữ kiểu ngăn xếp là: một chồng sách trên bàn, một chồng đĩa trong hộp, bang đạn... Xét ví dụ 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 của ngăn xếp: Giả sử có một stack S lưu trữ các kí tự. Ban đầu ngăn xếp ở trạng thái rỗng: Khi thực hiện lệnh bổ sung A, ngăn xếp có dạng: A Tiếp theo bổ sung B, C: C B A Lệnh loại bỏ phần tử của ngăn xếp sẽ loại bỏ phần tử mới nhất của ngăn xếp là C: B A 2. Cài đặt ngăn xếp. 2.1. Cài đặt ngăn xếp bằng mảng: Tư tưởng cài đặt: Để cài đặt ngăn xếp bằng mảng ta sử dụng mảng 1 chiều s để biểu diễn ngăn xếp. Thiết lập phần tử đầu tiên của mảng, s0 làm đáy ngăn xếp. Các phần tử tiếp theo được đưa vào ngăn xếp sẽ lần lượt được lưu tại các vi trí s1, s2… Nếu hiện tại ngăn xếp có n phần tử thì sn1 sẽ là phần tử mới nhất được đưa vào ngăn xếp. Để lưu giữ đỉnh hiện tại của ngăn xếp, ta sử dụng 1 con trỏ top. Chẳng hạn, nếu ngăn xếp có n phần tử thì top sẽ có giá trị bằng n1. Còn khi ngăn xếp chưa có phần tử nào thì ta quy ước top sẽ có giá trị 1. Nếu có 1 phần tử mới được đưa vào ngăn xếp thì nó sẽ được lưu tại vị trí kế tiếp trong mảng và giá trị của biến top tăng lên 1. Khi lấy ra 1 phần tử khỏi ngăn xếp, phần tử của mảng tại vị trí top sẽ được lấy ra và biến top giảm đi 1. Có 2 vấn đề xảy ra khi thực hiện các thao tác trong ngăn xếp. Khi ngăn xếp đã đầy tức là khi biến top đạt tới phần tử cuối cùng của mảng thì không thể tiếp tục thêm phần tử mới vào mảng. Và khi ngăn xếp rỗng tức là chưa có phần tử nào thì ta không thể lấy được phần tử ra từ ngăn xếp. Như vậy, ngoài các thao tác đưa vào và lấy phần tử ra khỏi ngăn xếp, cần có thao tác kiểm tra xem ngăn xếp có rỗng hoặc đầy hay không. • Khai báo bằng mảng cho 1 ngăn xếp chứa các số nguyên tối đa 100 phần tử như nhau: Thao tác khởi tạo ngăn xếp Thao tác kiểm tra ngăn xếp rỗng Thao tác kiểm tra ngăn xếp đầy
TRƯỜNG ĐẠI HỌC THƯƠNG MẠI KHOA HỆ THỐNG THÔNG TIN KINH TẾ BÀI THẢO LUẬN HỌC PHẦN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI: MÔ TẢ VIỆC CÀI ĐẶT VÀ ỨNG DỤNG CỦA NGĂN XẾP Lớp học phần: GVHD: Nhóm: Danh sách nhóm: 1302INFO1311 T.S Nguyễn Thị Thu Thủy 04 Lương Thị Hạnh.( Nhóm trưởng) Phan Hữu Minh Hoàng Thái Thị Mỹ Hạnh Trần Thị Hòa Đồn Thị Hoa Lại Thị Hoa Nguyễn Thị Thanh Hoa Mai Thị Kim Hằng Hoàng Thị Hạnh 10 Nguyễn Thị Thu Hằng Hà Nội, 2013 LỜI NÓI ĐẦU Ngăn xếp xem dạng đặc biệt danh sách, hay gọi kiểu danh sách hạn chế Nói cách khác, ngăn xếp cấu trúc liệu có hai thao tác bản: bổ sung ( push) laoij bỏ phần tử (pop) Trong việc loại bỏ tiến hành loại phần tử đưa vào danh sách Vì vậy, ngăn xếp gọi kiểu liệu có nguyên tắc LIFO ( Last In First Out- vào sau trước) Đồng thời, ngăn xếp, với hàng đợi hai cấu trúc liệu gần gũi với hoạt động thực tế Đặc biệt, khoa học máy tính, ngăn xếp có nhiều ứng dụng đơn giản hiệu đảo ngược chuỗi, chuyển đổi số, tính giá trị hậu tố Vậy ngăn xếp cài đặt ứng dụng nào? Trong báo cáo mình, nhóm chúng tơi trình bày khái niệm, mô tả cài đặt ứng dụng ngăn xếp, với chương trình demo viết ngơn ngữ C Hi vọng kiến thức giúp bạn trả lời câu hỏi Do hạn chế kiến thức nghiên cứu, chắn báo cáo khơng tránh khỏi thiếu sót Rất mong nhận góp ý từ bạn để nhóm hồn thiện Xin chân thành cảm ơn! Nhóm thực Nhóm 04 NỘI DUNG I.Ngăn xếp cài đặt ngăn xếp Khái niệm 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ó hai thao tác bản: bổ sung ( push) laoij bỏ phần tử (pop) Trong việc loại bỏ tiến hành loại phần tử đưa vào danh sách Vì vậy, ngăn xếp gọi kiểu liệu có ngun tắc LIFO ( Last In First Out- vào sau trước) Các ví dụ lưu trữ kiểu ngăn xếp là: chồng sách bàn, chồng đĩa hộp, bang đạn Xét ví dụ 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: Giả sử có stack S lưu trữ kí tự Ban đầu ngăn xếp trạng thái rỗng: Khi thực lệnh bổ sung A, ngăn xếp có dạng: A Tiếp theo bổ sung B, C: C B A Lệnh loại bỏ phần tử ngăn xếp loại bỏ phần tử ngăn xếp C: B A Cài đặt ngăn xếp 2.1 Cài đặt ngăn xếp mảng: Tư tưởng cài đặt: Để 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 vi 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 trỏ top Chẳng hạn, ngăn xếp có n phần tử top có giá trị n-1 Còn ngăn xếp chưa có phần tử ta quy ước top có giá trị -1 Nếu có phần tử đưa vào ngăn xếp lưu vị trí mảng giá trị biến top tăng lên Khi lấy phần tử khỏi ngăn xếp, phần tử mảng vị trí top lấy biến top giảm Có vấn đề xảy thực thao tác ngăn xếp Khi ngăn xếp đầy tức biến top đạt tới phần tử cuối mảng khơng thể tiếp tục thêm phần tử vào mảng Và ngăn xếp rỗng tức chưa có phần tử ta lấy phần tử từ ngăn xếp Như vậy, thao tác đưa vào 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 hay khơng • Khai báo mảng cho ngăn xếp chứa số nguyên tối đa 100 phần tử nhau: Thao tác khởi tạo ngăn xếp Thao tác kiểm tra ngăn xếp rỗng Thao tác kiểm tra ngăn xếp đầy Thao tác bổ sung phần tử vào ngăn xếp Thao tác lấy phần tử khỏi ngăn xếp Chương trình chính: Chương trình cài đặt ngăn xếp gồm n phần tử, n nhập từ bàn phím : Kết demo chương trình phần mềm DEV-CPP: 2.2 Cài đặt ngăn xếp danh sách liên kết Tư tưởng cài đặt: Để cài đặt ngăn xếp danh sách liên kết, ta sử dụng danh sách liên kết đơn Theo tính chất danh sách liên kết đơn, việc bổ sung loại bỏ phần tử khỏi danh sách thực đơn giản nhanh phần tử nằm đầu danh sách Do vậy, ta chọn cách lưu trữ ngăn xếp là: phần tử đầu danh sách đỉnh ngăn xếp, phần tử cuối danh sách đáy ngăn xếp Để bổ sung phần tử vào danh sách, ta tạo nút thêm vào đầu danh sách Để lấy phần tử khỏi ngăn xếp, ta cần lấy giá trị nút loại nút khỏi danh sách Như vậy, thấy ngăn xếp cài đặt danh sách liên kết có kích thước gần “vơ hạn” (tùy thuộc vào nhớ máy tính) Bất kì lúc ta them nút bổ sung vào điỉnh ngăn xếp thao tác push pop danh sách kiểu đơn giản Tuy nhiên số thao tác lại phức tạp so với ngăn xếp kiểu mảng, chẳng hạn truy cập tới phần tử ngăn xếp, đếm số phần tử ngăn xếp Khai báo ngăn xếp danh sách liên kết sau: Thao tác khởi tạo ngăn xếp: Thao tác kiểm tra ngăn xếp rỗng: Thao tác bổ sung phần tử vào ngăn xếp: Thao tác lấy phần tử khỏi ngăn xếp: Chương trình cài đặt ngăn xếp danh sách liên kết, gồm n phần tử, n nhập từ bàn phím: Kết demo: II Ứng dụng ngăn xếp Ngăn xếp có nhiều ứng dụng khoa học máy tính thực tế Trong giới hạn thảo luận mình, xin giới thiệu số ứng dụng ngăn xếp, bao gồm: - Đảo ngược xâu kí tự - Chuyển biểu thức dạng trung tố sang hậu tố - Tính giá trị biểu thức dạng hậu tố - Đổi số nguyên từ hệ thập phân sang hệ nhị phân Trong ví dụ mình, chúng tơi giả sử có ngăn xếp với hàm thao tác cài đặt Đảo ngược xâu kí tự: Đầu vào: xâu ký tự.ví dụ STACK Đầu ra: xâu đảo ngược : KCATS Tư tưởng : duyệt từ đầu đến cuối xâu, cho ký tự vào ngăn xếp Khi cho hết ký tự chuỗi vào ngăn xếp, lại lấy phần tử khỏi ngăn xếp in hình Theo tính chất ngăn xếp, phần tử vào sau, tức ký tự cuối chuỗi, in trước Như vậy, toàn ký tự xâu đảo ngược thứ tự Mã chương trình: Chương trình demo với phần mềm DEV-CPP có kết sau: Tính giá trị biểu thức hậu tố Biểu thức toán học dạng trung tố biểu thức tốn học thơng thường, bao gồm toán tử ( cộng, trừ, nhân, chia ), toán hạng dấu ngoặc để biết thứ tự tính tốn Ví dụ: 3*((5-2)*(7+1)-6) Trong tốn hạng này, vị trí dấu ngoặc quan trọng Mặc dù người, cách trình bày biểu thức tốn học theo dạng hợp lý nhất, máy tính lại tương đối phức tạp, thế, người ta đưa dạng trình bày khác cho biểu thức tốn học để máy tính dễ dàng việc tính tốn, gọi dạng hậu tố Theo cách trình bày này, tốn tử khơng nằm hai tốn hạng mà nằm sau hai tốn hạng Chẳng hạn biểu thức có dạng hậu tố: 352–71+*6-* Tính giá trị biểu thức sau: Toán tử - nằm sau nên ta lấy 5-2 lưu kết Toán tử cộng nằm sau nên lấy +1 lưu kết 8, toán tử * nằm sau kết vừa lưu nên lấy 8*3 lưu kết 24 Toán tử - nằm sau kết vừa lưu nên lấy 24-6 lưu kết 18 Toán tử * nằm sau kết vừa lưu nên 18*3=54 kết cuối Như vậy: Đầu vào: biểu thức hậu tố Đầu ra: kết biểu thức Tư tưởng: duyệt biểu thức từ trái qua phải - Nếu gặp toán hạng, cho vào ngăn xếp - Nếu gặp toán tử, lấy hai toán hạng từ ngăn xếp, sử dụng toán tử vừa gặp để tính tốn, đưa kết vào ngăn xếp Kết demo: Chuyển biểu thức dạng trung tố sang hậu tố Đầu vào: biểu thức dạng trung tố Đầu ra: biểu thức dạng hậu tố Tư tưởng: duyệt biểu thức từ trái qua phải - Nếu gặp dấu mở ngoặc : bỏ qua - Nếu gặp toán hạng: đưa vào biểu thức - Gặp toán tử: đưa vào ngăn xếp - Gặp dấu đóng ngoặc: lấy tốn tử ngăn xếp đưa vào biểu thức Mã chương trình: #include #include #define MAX 100 #define PLUS /* Dau cong */ #define MINUS /* Dau tru */ #define MULTIPLE /* Dau nhan */ #define DIVIDE /* Dau chia */ #define LPAREN /* Dau mo ngoac don */ #define RPAREN /* Dau dong ngoac don */ int top; struct { int toantu; }stack[MAX]; void push (int tt) { if (top < MAX-1) stack[++top].toantu = tt; } int isempty() { return top == -1; } int pop (int *tt) { if (!isempty()) { *tt = stack[top ].toantu; return 1; } return 0; } int get (int *tt) { Đổi số nguyên từ hệ thập phân sang hệ nhị phân Đầu vào: số nguyên hệ thập phân Đầu ra: số đổi sang hệ nhị phân Tư tưởng: - Chia số thập phân cho - Lấy số dư đưa vào ngăn xếp - Nếu thương =0 dừng - Nếu thương lớn gán số thương, quay lại bước - Lần lượt lấy số lưu ngăn xếp ra, dạng nhị phân số ban đầu Mã chương trình: /** Info: Convert number using stack **/ #include #include struct node{ int item; struct node *next; }; typedef struct node *stacknode; typedef struct { stacknode top; }stack; void stackinitialize(stack *s){ s->top = NULL; return; } int stackempty(stack s){ return(s.top==NULL); } void push(stack *s, int x){ stacknode p; p= (stacknode)malloc(sizeof(struct node)); p->item=x; p->next=s->top; s->top=p; return; } int pop(stack *s){ stacknode p; if ( stackempty(*s)){ printf ("ngan xep rong !"); } else { p=s->top; s->top=s->top->next; return p->item; } } /*Convert decimal number to binary number*/ void Convert(int num) { stack s; stackinitialize(&s); while (num) { push(&s,num%2); num /= 2; } while (!stackempty(s)) { printf("%d",pop(&s)); } } main() { int x; printf(" * nhap so can chuyen doi:"); scanf("%d",&x); printf("\n so da doi:");Convert(x); getch(); } BẢNG PHÂN CƠNG THẢO LUẬN NHĨM 04 S T T Họ Tên Hoàng Thị Hạnh Nội dung Cài đặt ngăn xếp mảng Mai Thị Kim Hằng Cài đặt ngăn xếp mảng Thái Thị Mỹ Hạnh Cài đặt danh sách liên kết Nguyễn Thị Thu Hằng Cài đặt danh sách liên kết Đoàn Thị Hoa ứng dụng chuyển từ biểu thức dạng trung tố sang hậu tố Lại Thị Hoa ứng dụng chuyển từ biểu thức dạng trung tố sang hậu tố Nguyễn Thị Thanh Hoa ứng dụng đảo ngược xâu sử dụng ngăn xếp Trần Thị Hòa ứng dụng chuyển từ biểu thức dạng trung tố sang hậu tố Phan Hữu Minh Hoàng ứng dụng đảo ngược xâu, tốn tính giá trị hậu tố, chuyển từ trung tố sang hậu tố Lương Thị Hạnh Bài tốn tính giá trị hậu tố, chuyển đổi số, tổng hợp word + slide Đánh giá Ghi B B B B B B B B A A Nhóm trưởng ... bỏ phần tử ngăn xếp loại bỏ phần tử ngăn xếp C: B A Cài đặt ngăn xếp 2.1 Cài đặt ngăn xếp mảng: Tư tưởng cài đặt: Để 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... tử vào ngăn xếp: Thao tác lấy phần tử khỏi ngăn xếp: Chương trình cài đặt ngăn xếp danh sách liên kết, gồm n phần tử, n nhập từ bàn phím: Kết demo: II Ứng dụng ngăn xếp Ngăn xếp có nhiều ứng dụng. .. làm đáy ngăn xếp Các phần tử đưa vào ngăn xếp lưu vi 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 trỏ top Chẳng hạn, ngăn xếp có