1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tiểu luận ứng dụng ngăn xếp (stack) và hàng đợi (queue) để viết chương trình biến đổi biểu thức trung tố thành tiền tố và hậu tố

25 1,6K 1

Đ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 25
Dung lượng 139,9 KB

Nội dung

Bài tiểu luận môn: Cấu trúc liệu giải thuật Mục lục Phần I: Mở đầu I Giới thiệu đề tài Trong khoa học máy tính, cấu trúc liệu cách lưu liệu máy tính cho sử dụng cách hiệu Thông thường, cấu trúc liệu chọn cẩn thận cho phép thực thuật toán hiệu Việc chọn cấu trúc liệu thường chọn cấu trúc liệu trừu tượng Một cấu trúc liệu thiết kế tốt cho phép thực nhiều phép tốn, sử dụng tài nguyên, thời gian xử lý không gian nhớ tốt Các cấu trúc liệu triển khai cách sử dụng kiểu liệu, tham chiếu phép tốn cung cấp ngơn ngữ lập trình Trong trội lên hai cấu trúc liệu Stack (ngăn xếp) Queue (hàng đợi) Stack Queue có ứng dụng nhiều kể thuật tốn lẫn thực tế Hàng ngày thường xuyên làm việc tiếp xúc với biểu thức, toán hạng, tốn tử… máy tính Tuy nhiên máy tính khơng thể hiểu ngơn ngữ cách viết người, để máy tính hiểu biểu thức phải chuyển chúng dạng mà máy tính thực Vì em xin chọn đề tài “Ứng dụng ngăn xếp (Stack) hàng đợi (Queue) để viết chương trình biến đổi biểu thức trung tố thành tiền tố hậu tố” để làm tiểu luận GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng Bài tiểu luận môn: Cấu trúc liệu giải thuật II Mục đích yêu cầu đề Mục đích Đề tài giúp em củng cố, nâng cao kiến thức môn học cấu trúc liệu giải thuật Từ hiểu sâu vận dụng vào toán số liệu thực tế đồng thời thông qua việc làm đề tài giúp em biết phương pháp nghiên cứu vấn đề nhỏ u cầu Dùng ngơn ngữ lập trình C/C++ để cài đặt chương trình Với liệu nhập vào từ bàn phím III Phương pháp nghiên cứu + Tham khảo tài liệu: cấu trúc liệu giải thuật, mạng… + Tìm hiểu thực tiễn, thực tế, quy cách, nhu cầu toán + Xin ý kiến, hướng dẫn giáo viên hướng dẫn Phần II: Nội dung I Ngăn xếp (Stack) • Ngăn xếp (Stack) danh sách có thứ tự mà phép chèn xóa thực đầu cuối danh sách người ta gọi đầu cuối đỉnh (top) stack Với nguyên tắc vào sau trước, danh sách kiểu LIFO (last - in - first - out) • Có cách lưu trữ Stack: + Bằng mảng + Bằng danh sách liên kết • Các thao tác Stack: Push: Đưa phần tử vào đỉnh Stack Pop: Lấy từ đỉnh Stack phần tử Peek: Xem đỉnh Stack chứa nội dung gì? GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng Bài tiểu luận môn: Cấu trúc liệu giải thuật • Một số ứng dụng Stack: Ứng dụng trực tiếp: Ứng dụng bật Stack Stack cho chương trình sử dụng Stack để gọi hàm Trong trình duyệt WEB, trang xem lưu stack Trong trình soạn thảo văn bản, thao tác Undo lưu stack Ứng dụng gián tiếp: Cấu trúc liệu bổ trợ cho thuật toán khác Một thành phần cấu trúc liệu khác II Hàng đợi (Queue) • Hàng đợi kiểu danh sách tuyến tính mà phép bổ sung thực đầu, gọi lối sau (rear) phép loại bỏ thực đầu khác gọi lối trước (front) Nguyên tắc vào trước trước, danh sách kiểu FIFO (first - in - first - out) • Có cách lưu trữ tương tự Stack: + Bằng mảng + Bằng danh sách liên kết • Ứng dụng Queue Ứng dụng trực tiếp Danh sách hàng đợi Quản lý truy cập tới tài nguyên dùng chung (ví dụ máy in) Multiprogramming Ứng dụng gián tiếp Cấu trúc liệu phụ trợ cho thuật toán Một phần CTDL khác III Ứng dụng Stack Queue ký pháp Ba Lan Khái niệm: GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng Bài tiểu luận môn: Cấu trúc liệu giải thuật Prefix: Biểu thức tiền tố biểu diễn cách đặt toán tử lên trước toán hạng Cách biểu diễn biết đến với tên gọi “ký pháp Ba Lan” nhà toán học Ba Lan Jan Łukasiewicz phát minh năm 1920 Với cách biểu diễn này, thay viết x + y dạng trung tố, ta viết + x y Tùy theo độ ưu tiên toán tử mà chúng xếp khác nhau, bạn xem số ví dụ phía sau phần giới thiệu Postfix: Ngược lại với cách Prefix, biểu thức hậu tố tức toán tử đặt sau toán hạng Cách biểu diễn gọi “ký pháp nghịch đảo Ba Lan” viết tắt RPN(Reverse Polish notation), phát minh vào khoảng thập kỷ 1950 triết học gia nhà khoa học máy tính Charles Hamblin người Úc Ví dụ: Chuyển đổi dạng Infix(trung tố) sang Postfix(hậu tố) Thuật toán: Bước 1: Đọc thành phần biểu thức E (dạng Infix biểu diễn xâu, đọc từ trái qua phải) Giả sử thành phần đọc x Bước 1.1: Nếu x tốn hạng viết vào bên phải biểu thức E1 (xâu lưu kết Postfix) Bước 1.2: Nếu x dấu ‘(’ đẩy vào Stack Bước 1.3: Nếu x phép toán +, -, *, / Bước 1.3.1: Xét phần tử y đỉnh Stack Bước 1.3.2: Nếu Pri(y) >= Pri(x) phép tốn loại y khỏi GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng Bài tiểu luận môn: Cấu trúc liệu giải thuật Stack viết y vào bên phải E1 quay lại bước 1.3.1 Bước 1.3.3: Nếu Pri(y) < Pri(x) đẩy x vào Stack Bước 1.4: Nếu x dấu ‘)’ Bước 1.4.1: Xét phần tử y đầu Stack Bước 1.4.2: y phép tốn loại y khỏi Stack, viết y vào bên phải E1 quay trở lại 1.4.1 Bước 1.4.3: Nếu y dấu ‘(’ loại y khỏi Stack Bước 2: Lập lại bước toàn biểu thức E đọc qua Bước 3: Loại phần tử đỉnh Stack viết vào bên phải E1 Lặp lại bước Stack rỗng Bước 4: Tính giá trị biểu thức dạng hậu tố Ví dụ: Cho biểu thức: E = a * (b + c) – d / e Tính giá trị biểu thức dạng Postfix(hậu tố) Thuật tốn: Bước 1: Đọc phần tử biểu thức E1 (từ trái qua phải) Nếu gặp toán hạng đẩy vào Stack Nếu gặp phép tốn lấy hai phần tử liên tiếp Stack thực phép toán, kết đẩy vào Stack Bước 2: Lập lại bước hết tất phần tử biểu thức E1 lúc GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng Bài tiểu luận môn: Cấu trúc liệu giải thuật đỉnh Stack chứa giá trị biểu thức cần tính Bước 3: Kết thúc Ví dụ: tính giá trị biểu thức sau: + + * + + / Giả thuật trình bày sau: Chuyển đổi dạng Infix(trung tố) sang Prefix(tiền tố) Thuật toán: Ý tưởn: Sử dụng Stack Queue Stackkq Bước 1: Đọc thành phần biểu thức E (dạng Infix biểu diễn xâu, đọc từ phải qua trái) Giả sử thành phần đọc x: Bước 1.1: Nếu x tốn hạng đưa vào Queue Bước 1.2: Nếu x dấu ‘)’ đẩy vào Stack Bước 1.3: Nếu x phép toán +, -, *, / thì: Bước 1.3.1: Kiểm tra xem stack có rỗng khơng? Nếu rỗng, đẩy vào Stack, không rỗng, sang bước 1.3.2 Bước 1.3.2: Lấy phần tử y đỉnh Stack Bước 1.3.3: Nếu Pre(y)>=Pre(x), đưa tất phần tử Queue vào Stackkq, đưa y vào Stackkq, đưa x vào Stack Bước 1.3.4: Nếu Pre(y)top = NULL; stack ->size = 0; } GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hồng Năng Hưng Bài tiểu luận mơn: Cấu trúc liệu giải thuật int IsStackEmpty(STACK *stack){ return (stack ->size == 0); } void PushStack(STACK *stack, Item item){ if(stack ->top == NULL){ stack ->top = (STACKNODE *)malloc(sizeof(STACKNODE)); stack ->top ->item = item; stack ->top ->next = NULL; } else{ STACKNODE *t = (STACKNODE *)malloc(sizeof(STACKNODE)); t ->item = item; t ->next = stack ->top; stack ->top = t; } stack ->size++; } Item PopStack(STACK *stack){ if(stack ->size > 0){ STACKNODE *t = stack ->top; stack ->top = stack ->top ->next; Item item = t ->item; free(t); stack ->size ; return item; } } Item PeekStack(STACK *stack){ if(stack ->size > 0) return stack ->top ->item; } // queue typedef struct _QUEUENODE{ Item item; struct _QUEUENODE *next; struct _QUEUENODE *prev; } QUEUENODE; typedef struct _QUEUE{ _QUEUENODE *front, *rear; int size; } QUEUE; GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng Bài tiểu luận môn: Cấu trúc liệu giải thuật void InitQueue(QUEUE *queue){ queue ->front = NULL; queue ->rear = NULL; queue ->size = 0; } int IsQueueEmpty(QUEUE *queue){ return (queue ->size == 0); } void PushQueue(QUEUE *queue, Item item){ if(queue ->front == NULL && queue ->rear == NULL){ queue ->front = (QUEUENODE *)malloc(sizeof(QUEUENODE)); queue ->front ->item = item; queue ->front ->next = NULL; queue ->front ->prev = NULL; queue ->rear = queue ->front; } else{ QUEUENODE *t = (QUEUENODE *)malloc(sizeof(QUEUENODE)); t ->item = item; t ->next = queue ->front; t ->prev = NULL; queue ->front ->prev = t; queue ->front = t; } queue->size++; } Item PopQueue(QUEUE *queue){ if(queue ->size != 0){ QUEUENODE *t = queue->rear; if(queue ->rear == queue->front){ queue ->rear = NULL; queue ->front = NULL; } else{ queue ->rear = queue ->rear ->prev; queue ->rear ->next = NULL; } queue ->size ; Item i = t ->item; free(t); return i; GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 10 Bài tiểu luận môn: Cấu trúc liệu giải thuật } } Item PeekQueue(QUEUE *queue) { if(queue->size > 0) return queue->front->item; } int DocSo(char str[], int &i){ int len = strlen(str); int j = 0; char t[20]; while(i < len){ if(str[i] >= '0' && str[i] = '0' && str[i] size; QUEUENODE *i; Item item; STACK stack; InitStack(&stack); for(i = queue ->rear; i != NULL; i = i ->prev){ item = i ->item; switch(item.type){ case OPERAND:{ PushQueue(output, item); } break; case OPERATOR:{ while(priority(item.value) 0){ Item iTemp = PopStack(&stack); PushQueue(output, iTemp); } PushStack(&stack, item); } break; case PARENT_OPEN:{ PushStack(&stack, item); GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 12 Bài tiểu luận môn: Cấu trúc liệu giải thuật } break; case PARENT_CLOSE:{ item = PopStack(&stack); while(item.type != PARENT_OPEN){ PushQueue(output, item); item = PopStack(&stack); } } break; } } while(stack.size > 0) { item = PopStack(&stack); PushQueue(output, item); } } void Print(QUEUE *queue){ QUEUENODE *i; Item item; for(i = queue ->rear; i != NULL; i = i ->prev){ item = i ->item; switch(item.type){ case OPERAND: printf("%d ", (int)item.value); break; case OPERATOR: case PARENT_OPEN: case PARENT_CLOSE: printf("%c ", (int)item.value); break; } } printf("\n"); } // tinh gia tri cua bieu thuc hau to float Calculate(QUEUE *queue){ float result = 0; STACK stack; InitStack(&stack); QUEUENODE *i; Item item; for(i = queue ->rear; i != NULL; i = i ->prev){ item = i ->item; GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 13 Bài tiểu luận môn: Cấu trúc liệu giải thuật if(item.type == OPERAND) PushStack(&stack, item); else{ //OPERATOR if(stack.size < 2) return ERROR; float a = PopStack(&stack).value; float b = PopStack(&stack).value; switch((int)item.value){ case '+': result = a + b; break; case '-': result = b - a; break; case '*': result = a * b; break; case '/': if(a == 0) result = 0; else result = b / a; } item.value = result; item.type = OPERAND; PushStack(&stack, item); } } return PopStack(&stack).value; } // chuyen bieu thuc trung to sang tien to void Convert2(QUEUE *queue, QUEUE *output){ int size = queue ->size; QUEUENODE *i; Item item; STACK stack; InitStack(&stack); for(i = queue ->front; i != NULL; i = i ->next){ item = i ->item; switch(item.type){ case OPERAND:{ PushQueue(output, item); } break; GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 14 Bài tiểu luận môn: Cấu trúc liệu giải thuật case OPERATOR:{ while(priority(item.value) < priority(PeekStack(&stack).value) && stack.size > 0){ Item iTemp = PopStack(&stack); PushQueue(output, iTemp); } PushStack(&stack, item); } break; case PARENT_OPEN:{ item = PopStack(&stack); while(item.type != PARENT_CLOSE){ PushQueue(output, item); item = PopStack(&stack); } } break; case PARENT_CLOSE:{ PushStack(&stack, item); } break; } } while(stack.size > 0){ item = PopStack(&stack); PushQueue(output, item); } } void Print2(QUEUE *queue){ QUEUENODE *i; Item item; for(i = queue ->front; i != NULL; i = i ->next){ item = i ->item; switch(item.type){ case OPERAND: printf("%d ", (int)item.value); break; case OPERATOR: case PARENT_OPEN: case PARENT_CLOSE: printf("%c ", (int)item.value); break; } GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hồng Năng Hưng 15 Bài tiểu luận mơn: Cấu trúc liệu giải thuật } printf("\n"); } // tinh gia tri cua bieu thuc tien to float Calculate2(QUEUE *queue){ float result = 0; STACK stack; InitStack(&stack); QUEUENODE *i; Item item; for(i = queue ->rear; i != NULL; i = i ->prev){ item = i ->item; if(item.type == OPERAND) PushStack(&stack, item); else{ //OPERATOR if(stack.size < 2) return ERROR; float a = PopStack(&stack).value; float b = PopStack(&stack).value; switch((int)item.value){ case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': if(b == 0) result = 0; else result = a / b; } item.value = result; item.type = OPERAND; PushStack(&stack, item); } } return PopStack(&stack).value; } int main() { GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hồng Năng Hưng 16 Bài tiểu luận mơn: Cấu trúc liệu giải thuật char str[100]; float t; QUEUE infix, postfix, prefix; InitQueue(&infix); InitQueue(&postfix); InitQueue(&prefix); printf("\nNhap bieu thuc trung to: "); gets(str); Tach(str, &infix); Convert(&infix, &postfix); printf("\nBieu thuc hau to la: "); Print(&postfix); t = Calculate(&postfix); if(t == ERROR) printf("\nBieu thuc loi!"); else printf("\nGia tri bieu thuc: %0.2f", t); printf("\n"); Convert2(&infix, &prefix); printf("\nBieu thuc tien to la: "); Print2(&prefix); t = Calculate2(&prefix); if(t == ERROR) printf("\nBieu thuc loi!"); else printf("\nGia tri bieu thuc: %0.2f", t); getch(); return 0; } Kết sau: GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hồng Năng Hưng 17 Bài tiểu luận mơn: Cấu trúc liệu giải thuật Nhận xét: cịn nhiều cách khác thuật tốn khác để áp dụng chuyển biểu thức trung tố sang hậu tố tiền tố, tính giá trị biểu thức tiền tố hậu tố Thế cách đầy đủ rõ ràng Nó áp dụng tốt cho người lập trình Bởi bao gồm đầy đủ, sử dụng Stack Queue Phần III: Kết luận Thơng qua việc tìm hiểu ứng dụng Stack Queue để để viết chương trình biến đổi biểu thức trung tố thành tiền tố, hậu tố tính giá trị biểu thức tiền tố hậu tố em rút nhiều điều Từ cách xác định giải thuật đến tư logic chương trình chạy thành công phần mềm Devcpp++ 5.11 ngôn ngữ C/C++ Rút cách làm tiểu luận chuẩn Có kết nhờ có dạy dỗ chu đáo cô giáo Trịnh Thị Phú q trình truyền thụ kiến thức mơn học cấu trúc liệu giải thuật, đồng thời cô người hướng dẫn tận tình suốt trình thực đề tài tiểu luận mơn học GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 18 Bài tiểu luận môn: Cấu trúc liệu giải thuật Em xin chân thành cám ơn cô! Thanh Hóa, ngày….tháng 11 năm 2015 Giáo viên hướng dẫn Sinh viên thực Ths Trịnh Thị Phú Hoàng Năng Hưng TÀI LIỆU THAM KHẢO [1] Giáo trình cấu trúc liệu giải thuật, Đỗ Xuân Lôi, NXB Đại học Quốc Gia Hà Nội [2] Lập trình C bản, Hanoi Aptech Computer Education Center [3] Gs Phạm Văn Ất Kỹ thuật lập trình C sở nâng cao, NXB Giao thông vận tải Hà Nội – 2006 GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 19 Bài tiểu luận môn: Cấu trúc liệu giải thuật GVHD: Trịnh Thị Phú Sinh vên thực hiện: Hoàng Năng Hưng 20 ... Hưng 17 Bài tiểu luận mơn: Cấu trúc liệu giải thuật Nhận xét: nhiều cách khác thuật tốn khác để áp dụng chuyển biểu thức trung tố sang hậu tố tiền tố, tính giá trị biểu thức tiền tố hậu tố Thế... áp dụng tốt cho người lập trình Bởi bao gồm đầy đủ, sử dụng Stack Queue Phần III: Kết luận Thơng qua việc tìm hiểu ứng dụng Stack Queue để để viết chương trình biến đổi biểu thức trung tố thành. .. trị biểu thức dạng tiền tố Ví dụ: Cho biểu thức sau chuyển dạng Prefix: E=a*b+c/d Giải thuật trình bày sau: Tình giá trị biểu thức dạng Prefix (tiền tố) Thuật toán: Bước 1: Đọc phần tử biểu thức

Ngày đăng: 20/11/2015, 16:42

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w