Cấu trúc dữ liệu Stack
lượt xem 20
download
Stack là 1 cấu trúc dữ liệu tuyến tính mà chỉ có thể truy nhập tới phần tử cuối cùng của nó để nhập và xuất dữ liệu. Cấu trúc LIFO(Last in first out – vào sau ra trước). Xem hình minh hoạ ở slide tiếng anh
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Cấu trúc dữ liệu Stack
- Chủ đề week 4 Ch Cấu trúc dữ liệu Stack (ngăn xếp). - Triển khai ngăn xếp dùng mảng - Triển khai ngăn xếp dùng danh sách liên kết Cấu trúc dữ liệu Queue (hàng đợi). - Triển khai queue vòng sử dụng mảng - Triển khai queue sử dụng danh sách liên kết Bài tập với Stack và Queue.
- Stack là 1 cấu trúc dữ liệu tuyến tính mà Stack chỉ có thể truy nhập tới phần tử cuối cùng của nó để nhập và xuất dữ liệu. Cấu trúc LIFO(Last in first out – vào sau ra trước). Xem hình minh hoạ ở slide tiếng anh
- Các phép toán trên Stack Initialize(stack) - khởi tạo • • Empty(stack) - kiểm tra stack có rỗng không. • Full(stack) - kiểm tra stack có đầy không • Push(el,stack) – thêm fần tử el vào đỉnh của stack. • Pop(stack) - lấy ra phần tử trên đỉnh stack Vậy làm thế nào để triển khai 1 stack?
- Phân tách khai triển từ đặc tả Interface (giao diện): đặc tả các phép toán • được cho phép. Implementation (triển khai): cung cấp • code cho các phép toán. Client: các code mà ta sử dụng. • Có thể sử dụng mảng hoặc linked list để • triển khai stack. Khách có thể làm việc ở mức trừu tượng • cao.
- Khai triển sử dụng mảng Mỗi phần tử của stack được lưu trữ như là • 1 phần tử của mảng. • Stack rỗng: top=0;// top là chỉ số của phần tử đỉnh stack • Stack đầy: top=max_element(chỉ số phần tử cuối của mảng).
- Đặc tả Stach (stack.h) #define Max 50//số fần tử tối đa • typedef int Eltype;//kiểu phần tử mảng là int • typedef Eltype StackType[Max];//định nghĩa kiểu • StackType là mảng Max phần tử có kiểu Eltype. int top; • void Initialize(StackType stack); • int empty(StackType stack); • int full(StackType stack); • void push(Eltype el, StackType stack); • Eltype pop(StackType stack); •
- Khai triển mảng của Stack (stack.c) Initialize(StackType stack) push(Eltype el, StackType stack) { { top=0; if (full(stack)) } printf(“stack tràn”); empty(StackType stack) else stack[top++] = el; { } return top == 0; Eltype pop(StackType stack) } { full(StackType stack) if (empty(stack)) printf(“stack không còn để lấy { ra”); return top == Max; else return stack[--top]; } }
- Khai triển stack sử dụng cấu trúc Khai triển: stack được thể hiện là 1 cấu trúc có 2 trường 1 để lưu trữ, 1 để theo dõi vị trí của phần tử trên cùng. #define Max 50 typedef int Eltype; typedef struct StackRec { Eltype storage[Max]; int top; }; typedef struct StackRec StackType;
- Khai triển stack sử dụng cấu trúc Initialize(StackType *stack) push(Eltype el, StackType *stack) { { (*stack).top=0; if (full(*stack)) } printf(“stack tràn”); empty(StackType stack) else (*stack).storage[ { (*stack).top++]=el; return stack.top == 1; } } Eltype pop(StackType *stack) full(StackType stack) { { if (empty(stack)) printf(“stack không còn để lấy return stack.top == Max; ra”); } else return (*stack).storage[--(*stack).top]; }
- Khai triển sử dụng linked list triển stack sử dụng linked list rất đơn giản. Khai Sự khác nhau giữa 1 linked list bình thường và 1 stack sử dụng linked list là 1 và phép toán của linked list không sử dụng được cho stack. Là stack thì ta chỉ có 1 phép toán chèn(insert) duy nhất là push(). - Trong nhiều trường hợp thì push giống như là phép chèn vào trước. Ta cũng chỉ có 1 phép xoá (delete) là pop(). - Phép toán này giống như là phép xoá từ phía trước.
- Diễn tả bằng hình ảnh của stack trong slide tiếng anh Xem struct node { int data; struct node *link; };
- Push struct node *push(struct node *p, int value) { struct node *temp; temp= (struct node *)malloc(sizeof(struct node)); if(temp==NULL) { printf(“không còn bộ nhớ, Error!\n"); exit(0); } temp->data = value; temp->link = p; p = temp; return(p); } - Xem minh hoạ trong slide tiếng anh
- Pop (linked list) struct node *pop(struct node *p, int *value) { struct node *temp; if(p==NULL) { printf(" Stack rỗng,không thể pop”); exit(0); } *value = p->data; temp = p; p = p->link; free(temp);//lưu ý: giá trị của phần tử top phải được ghi lại trước khi thực hiện phép toán pop return(p); }
- Sử dụng stack trong chương trình # include printf(“nhập 1 để pop 1 phần # include tử\n"); void main() scanf("%d",&n); { while( n == 1) struct node *top = NULL; { int n,value; top = pop(top,&value); do printf(“giá trị được pop ra là: { %d\n",value); do printf(" nhập 1 để pop 1 phần { tử\n"); printf(“nhập phần tử để scanf("%d",&n); push vào\n"); } scanf("%d",&value); printf(" nhập 1 để tiếp tục\n "); top = push(top,value); scanf("%d",&n); printf(“nhập 1 để tiếp } while(n == 1); tục\n"); } scanf("%d",&n); } while(n == 1);
- Exercises kiểu stack bạn đã định nghĩa trong 1 Test chương trình mà nhận từ người sử dụng 1 xâu, và đảo ngược nó.
- Cộng những số cực lớn Xử lý những số này như là 1 xâu chữ số, lưu trữ những số tương ững với các chữ số này trong 2 stacks.Sau đó thực hiện phép cộng bằng cách lấy các số (pop()) trong stack ra. Xem hình minh hoạ ở slide tiếng anh.
- Cộng những số cực lớn Thuật toán chi tiết Đọc các chữ số của số đầu tiên và trữ các số tương ứng của chúng vào stack. Đọc các chữ số của số thứ 2 và trữ các số tương ứng của chúng vào stack khác. result=0; Trong khi còn ít nhất 1 Stack không rỗng: - Pop 1 số từ mỗi stack không rỗng ra và cộng chúng. - Push tổng (trừ đi 10 nếu cần thiết) vào stack kết quả . - Trữ số nhớ ở trong result. Push số nhớ vào stack kết quả nếu nó khác 0. Pop các số từ stack kết quả ra và trình diễn chúng ra màn hình.
- Exercise 4.1: Stack sử dụng mảng giả thiết rằng bạn lập 1 quyển danh bạ điện Ta thoại. Khai báo 1 cấu trúc “address” gồm ít nhất là "name", "telephone number" and "e-mail address”. Viết 1 chương trình copy dữ liệu của 1 address book từ 1 file vào 1 file khác sử dụng stack. Đầu tiên đọc dữ liệu của 1 address book rồi push vào 1 stack.Rồi pop dữ liệu từ stack ghi ra 1 file khác theo thứ tự mà bạn pop ra.(tức là theo thứ tự ngược với thứ tự đầu).
- Sự chuyển đổi sang kí pháp Balan ngược sử dụng stack Viết 1 chương trình chuyển đổi từ biểu thức ký pháp giữa sang biểu thức theo ký pháp Balan ngược(bthức hậu tố).1 biểu thức bao gồm các chữ số dương (1->9) và 4 phép toán (+ - * /). Đọc 1 biểu thức theo ký pháp giữa từ 1 đầu vào chuẩn, chuyển sang ký pháp Balan ngược và đưa ra dưới dạng đầu ra chuẩn.Tham khảo sách giao khoa để có thêm chi tiết về ký pháp Balan ngược. Ví dụ: - Vào: 3+5*6 - Ra: 356*+
- Solution: eval.c switch (d.u.op) { #include "polish.h" case '+': int evaluate(stack *polish) d.u.val = d1.u.val + d2.u.val; { break; data d, d1, d2; case '-': stack eval; d.u.val = d1.u.val - d2.u.val; initialize(&eval); break; while (!empty(polish)) { case '*': d = pop(polish); d.u.val = d1.u.val * d2.u.val; switch (d.kind) { } case value: push(d, &eval); push(d, &eval); } break; } case operator: d = pop(&eval); d2 = pop(&eval); return d.u.val; d1 = pop(&eval); } d.kind = value; /* bắt đầu ghi đè d */
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Giáo trình cấu trúc dữ liệu và giải thuật_Chương 3: Cấu trúc Stack & Queue
18 p | 709 | 351
-
Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 5: Ngăn xếp – hàng đợi
88 p | 120 | 21
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 6 - Trần Thị Kim Chi
67 p | 88 | 15
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 3.2 - Trần Minh Thái
58 p | 126 | 14
-
Bài giảng Cấu trúc dữ liệu: Chương 7 - Nguyễn Xuân Vinh
61 p | 75 | 10
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Stack and Queue - TS. Ngô Hữu Dũng
61 p | 148 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Stack and Queue
30 p | 74 | 9
-
Bài giảng Cấu trúc dữ liệu - Chương 5: Ngăn xếp - Hàng đợi
92 p | 73 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Stack - Queue
34 p | 104 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - ĐH Bách khoa TP. HCM
25 p | 83 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 8 - Trường ĐH Văn Lang
38 p | 23 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 - Đỗ Bích Diệp
29 p | 95 | 5
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Ngăn xếp - TS. Đào Nam Anh
69 p | 56 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 9: Ngăn xếp - Stacks
24 p | 32 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Th.S Thiều Quang Trung
74 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu: Chương 5 - ThS. Thiều Quang Trung (2018)
74 p | 59 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2
48 p | 22 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn