1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Các kĩ thuật lập trình: Phần 2

131 6 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

Bài giảng Các kĩ thuật lập trình: Phần 2 trình bày các nội dung chính sau: Ngăn xếp, hàng đợi và danh sách móc nối; Cây; Đồ thị và cuối cùng là Sắp xếp và tìm kiếm. Phần phụ lục là bài tập tổng hợp lại những kiến thức cơ bản nhất đã được đề cập trong bài giảng và được thể hiện bằng một chương trình. Mời các bạn cùng tham khảo để nắm nội dung chi tiết.

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG  KHOA CÔNG NGHỆ THÔNG TIN BÀI GIẢNG CÁC KĨ THUẬT LẬP TRÌNH NGUYỄN DUY PHƯƠNG HàNội 2017 CHƢƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 4.1 Kiểu liệu ngăn xếp ứng dụng 4.1.1 Định nghĩa khai báo Ngăn xếp (Stack) hay xếp chồng kiểu danh sách tuyến tính đặc biệt mà phép bổ xung phần tử loại bỏ phần tử luôn đƣợc thực đầu gọi đỉnh (top) Có thể hình dung stack nhƣ chồng đĩa đƣợc xếp vào hộp băng đạn đƣợc nạp vào súng liên Quá trình xếp đĩa nạp đạn đƣợc thực đầu, đĩa viên đạn cuối lại chiếm vị trí đỉnh đĩa đầu viên đạn đầu lại đáy hộp (bottom), lấy đĩa cuối viên đạn cuối lại đƣợc lấy trƣớc tiên Nguyên tắc vào sau trƣớc stack đƣợc gọi dƣới tên khác LIFO (Last- in- First- Out) Stack rỗng bao gồm số phần tử Có hai thao tác cho stack thêm nút vào đỉnh stack (push) loại bỏ nút đỉnh stack (pop) Nếu ta muốn thêm nút vào đỉnh stack trƣớc ta phải kiểm tra xem stack đầy (full) hay chƣa, ta muốn loại bỏ nút stack ta phải kiểm tra stack có rỗng hay khơng Hình 4.1 minh họa thay đổi stack thông qua thao tác thêm bớt đỉnh stack Giả sử ta có stack S lƣu trữ kí tự Trạng thái bắt đầu stack đƣợc mơ tả hình a Khi thao tác: push(S,‟G‟) (hình b) push(S,‟H‟) (hình c) pop(S) (hình d) pop(S) (hình e) push(S,‟I‟) (hình f) F E D C B A (hình a) G F E D C B A (hình b) H G F E D C B A (hình c) G F E D C B A (hình d) F E D C B A (hình e) I F E D C B A (hình f) Có thể lƣu trữ stack dƣới dạng vector S gồm n thành phần liên tiếp Nếu T là địa phần tử đỉnh stack T có giá trị biến đổi stack hoạt động Ta 78 gọi phần tử stack phần tử thứ 0, nhƣ stack rỗng T có giá trị nhỏ ta qui ƣớc -1 Stack tràn T có giá trị n-1 Mỗi phần tử đƣợc thêm vào stack, giá trị T đƣợc tăng lên đơn vị, phần tử bị loại bỏ khỏi stack giá trị T giảm đơn vị TOP T S1 S2 S3 ST BOOTTOM Để khai báo stack, dùng mảng chiều Phần tử thứ đáy stack, phần tử cuối mảng đỉnh stack Một stack tổng quát cấu trúc gồm hai trƣờng, trƣờng top số nguyên đỉnh stack Trƣờng node: mảng chiều gồm MAX phần tử phần tử nút stack Một nút stack biến đơn cấu trúc phản ánh tập thơng tin nút Ví dụ, khai báo stack dùng để lƣu trữ số nguyên #define TRUE #define FALSE #define MAX 100 typedef struct { int top; int nodes[MAX]; } stack; 4.1.2 Các thao tác với stack Trong khai báo stack dùng danh sách tuyến tính, cần định nghĩa MAX đủ lớn để lƣu trữ đƣợc đỉnh stack Một stack bị tràn (TOP = MAX- 1) khơng thể thêm vào phần tử stack, stack rỗng khơng thể đƣa phần tử Vì vậy, cần xây dựng thêm thao tác kiểm tra stack có bị tràn hay khơng (full) thao tác kiểm tra stack có rỗng hay khơng (empty) Thao tác Empty: Kiểm tra stack có rỗng hay không: int Empty(stack *ps) { if (ps ->top == -1) return(TRUE); return(FALSE); } Thao tác Push: Thêm nút x vào đỉnh stack thay đổi đỉnh stack void Push (stack *ps, int x) { 79 if ( ps ->top == -1) { printf(“\n stack full”); return; } ps -> top = ps ->top + 1; ps -> nodes[ps->top] = x; } Thao tác Pop : Loại bỏ nút đỉnh stack int Pop ( stack *ps) { if (Empty(ps) { printf(“\n stack empty”); return(0); } return( ps -> nodes[ps->top ]); } 4.1.3 ứng dụng stack Ví dụ 4.1 Chƣơng trình đảo ngƣợc xâu kí tự: q trình đảo ngƣợc xâu kí tự giống nhƣ việc đƣa vào (push) kí tự xâu vào stack, sau đƣa (pop) kí tự stack stack rỗng ta đƣợc xâu đảo ngƣợc Chƣơng trình sau minh họa chế LIFO đảo ngƣợc xâu kí tự sử dụng stack #include #include #include #include #include #define MAX 100 #define TRUE #define FALSE typedef struct{ int top; char node[MAX]; } stack; /* nguyen mau cua ham*/ int Empty(stack *); void Push(stack *, char); char Pop(stack *); /* Mo ta ham */ int Empty(stack *ps){ if (ps->top==-1) return(TRUE); 80 return(FALSE); } void Push(stack *ps, char x){ if (ps->top==MAX-1 ){ printf("\n Stack full"); delay(2000); return; } (ps->top)= (ps->top) + 1; ps->node[ps->top]=x; } char Pop(stack *ps){ if (Empty(ps)){ printf("\n Stack empty"); delay(2000);return(0); } return( ps ->node[ps->top ]); } void main(void){ stack s; char c, chuoi[MAX]; int i, vitri,n;s.top=-1;clrscr(); printf("\n Nhap String:");gets(chuoi); vitri=strlen(chuoi); for (i=0; itop==-1){ printf("\n Stack empty"); delay(2000);return(TRUE); } return(FALSE); } void Push(stack *ps, int p){ if (ps ->top==MAX-1){ printf("\n Stack full"); delay(2000);return; } ps->top=(ps->top) + 1; ps->node[ps->top]=p; } int Pop(stack *ps ){ if (Empty(ps)){ printf("\n Stack Empty"); delay(2000); return(0); } return(ps->node[ps->top ]); } void main(void){ int n, coso, sodu; stack s;s.top=-1; clrscr(); printf("\n Nhap mot so n=");scanf("%d",&n); printf("\n Co so can chuyen:");scanf("%d",&coso); while(n!=0){ sodu= n % coso; Push(&s,sodu); n=n/coso; } while(!Empty(&s)) printf("%X", Pop(&s)); getch(); } 82 Ví dụ 4.3- Tính giá trị biểu thức dạng hậu tố Xét biểu thức dạng hậu tố chứa phép toán cộng (+), trừ (-), nhân (*), chia (/), lũy thừa ($) Cần phải nhắc lại rằng, nhà logic học Lewinski chứng minh đƣợc rằng, biểu thức biểu diễn dƣới dạng hậu tố mà khơng cần dùng thêm kí hiệu phụ Ví dụ : 23+5*2$ = ( (2 + 3) *5 ) = 625 Để tính giá trị biểu thức dạng hậu tố, sử dụng stack lƣu trữ biểu thức q trình tính tốn đƣợc thực nhƣ sau: Lấy toán hạng ( ) -> Lấy toán hạng ( ) -> Lấy phép toán „+‟ -> Lấy toán hạng cộng toán hạng đẩy vào stack (5) -> Lấy toán hạng (5), lấy phép toán (*), nhân với toán hạng đẩy vào stack (25), lấy toán hạng (2), lấy phép toán ($) thực hiện, lấy luỹ thừa đẩy vào stack Cuối ta nhận đƣợc 25 2= 625 Chƣơng trình tính giá trị biểu thức dạng hậu tố đƣợc thực nhƣ sau: #include #include #include #include #include #include #define MAX 100 #define TRUE #define FALSE typedef struct{ int top; double node[MAX]; } stack; int Empty(stack *); void Push( stack *, double); double Pop(stack *); double Dinhtri(char *); int lakyso(char); double tinh(int, double, double); int Empty(stack *ps) { if (ps->top==-1){ printf("\n Stack empty"); delay(2000);return(TRUE); } return(FALSE); } void Push(stack *ps, double p){ 83 if (ps ->top==MAX-1){ printf("\n Stack full"); delay(2000);return; } ps->top=(ps->top) + 1; ps->node[ps->top]=p; } double Pop(stack *ps ){ if (Empty(ps)){ printf("\n Stack Empty"); delay(2000); return(0); } return(ps->node[ps->top ]); } double Dinhtri(char *Bieuthuc){ int i,c, vitri; double toanhang1, toanhang2, giatri; stack s; s.top=-1;vitri=strlen(Bieuthuc); for(i=0;i='0' && kitu

Ngày đăng: 01/03/2022, 09:34

Xem thêm:

w