Sử dụng các cấu trúc dữ liệu đã học danh sách móc nối, ngăn xếp, hàng đợi,… để thực hiện bài toán “chuyển đổi biểu thức trung tố thành biểu thức hậu tố

22 268 1
Sử dụng các cấu trúc dữ liệu đã học danh sách móc nối, ngăn xếp, hàng đợi,… để thực hiện bài toán “chuyển đổi biểu thức trung tố thành biểu thức hậu tố

Đ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

MỤC LỤC A Giới thiệu chung Định nghĩa biểu thức trung tố biểu thức hậu tố? .3 Phân công nhiệm vụ 3 Các cấu trúc liệu sử dụng B Cài đặt cấu trúc liệu cụ thể I Cấu trúc ngăn xếp (Stack) Ngăn xếp gì? .3 Thuật toán chung toán Ví dụ minh họa 4 Các hàm cụ thể 5 Test kết II Cây nhị phân tìm kiếm Cây nhị phân tìm kiếm gì? Cấu trúc liệu cho toán Ví dụ minh họa 10 Các hàm sử dụng toán 13 Test kết 17 III Hàng đợi 17 Hàng đợi hì? 17 Ứng dụng Queue kí pháp Ba Lan 18 Các hàm sử dụng 19 Test kết 20 Đề bài: Sử dụng cấu trúc liệu học: danh sách móc nối, ngăn xếp, hàng đợi, … để thực toán “chuyển đổi biểu thức trung tố thành biểu thức hậu tố” Yêu cầu: - Dữ liệu sinh ngẫu nhiên nhập từ bàn phím Dữ liệu tổ chức lưu trữ tệp tin Mô giải thuật phương pháp trực quan Đánh giá độ phúc tạp thuật toán cấu trức dữu liệu khác A Giới thiệu chung Định nghĩa biểu thức trung tố biểu thức hậu tố? Các biểu thức đại số sử dụng ngày biểu diễn dạng trung tố (infix) Cách biểu diễn dễ hiểu với người hầu hết tốn tử (+, -, *, /) tốn tử hai ngơi chúng phân cách hai toán hạng với Tuy nhiên máy tính, để tính giá trị biểu thức đại số theo dạng không đơn giản ta làm Để khắc phục điều đó, máy tính cần chuyển cách biểu diễn biểu thức đại số từ trung tố sang dạng khác tiền tố hậu tố – Prefix: Biểu thức tiền tố biểu diễn cách đặt toán tử lên trước tốn hạng Cách biểu diễn cị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 +xy 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, 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 Phân công nhiệm vụ Ngăn xếp Hà Thị Vân Nguyễn Thị Vương Anh Hằng Châu Phương  Cây nhị phân tìm kiếm Hàng đợi Thị   Các cấu trúc liệu sử dụng - Cấu trúc ngăn xếp - Cấu trúc - Cấu trúc hàng đợi B Cài đặt cấu trúc liệu cụ thể I Cấu trúc ngăn xếp (Stack) Ngăn xếp gì? Một ngăn xếp cấu trúc liệu trừu tượng (Abstract Data Type – viết tắt ADT), sử dụng hầu hết ngơn ngữ lập trình Đặt tên ngăn xếp hoạt động ngăn xếp đời sống thực, ví dụ cỗ hay chồng đĩa, … Thuật toán chung toán Thuật toán để chuyển biểu thức Infix sang dạn Prefix: Đọc token biểu thức infix từ trái qua phải, với token ta thực bước sau: – Nếu toán hạng: cho output – Nếu dấu mở ngoặc “(“: cho vào stack – Nếu dấu đóng ngoặc “)”: lấy toán tử stack cho vào output gặp dấu mở ngoặc “(“ (Dấu mở ngoặc phải đưa khỏi stack) – Nếu toán tử: +/Chừng đỉnh stack tốn tử tốn tử có độ ưu tiên lớn tốn tử lấy tốn tử khỏi stack cho output +/Đưa toán tử vào stack Sau duyệt hết biểu thức infix, stack phần tử lấy token cho vào output Ví dụ minh họa - Biến đổi biểu thức trung tố sau thành biểu thức hậu tố: A*B+C*((D –E)+F)/G - Biểu thức trung tố sau chuyển ta được: AB*CDE-F*G/+ - Sơ đồ chuyển đổi Các hàm cụ thể 4.1 Các hoạt động Stack Các hoạt động ngăn xếp liên quan tới việc khởi tạo ngăn xếp, sử dụng sau xóa Ngoài hoạt động này, ngăn xếp có hai hoạt động nguyên sơ liên quan tới khái niệm, là: - Hoạt động push(): lưu giữ phần tử ngăn xếp - Hoạt động pop(): xóa phần tử từ ngăn xếp Khi liệu PUSH lên ngăn xếp: Để sử dụng ngăn xếp cách hiệu quả, cần kiểm tra trạng thái ngăn xếp Để phục vụ cho mục đích này, số tính hỗ trợ khác ngăn xếp: - Hoạt động peek(): lấy phần tử liệu ngăn xếp, mà khơng xóa phần tử - Hoạt động isFull(): kiểm tra xem ngăn xếp đầy hay chưa - Hoạt động isEmpty(): kiểm tra xem ngăn xếp trống hay không Tại thời điểm, trì trỏ tới phần tử liệu vừa PUSH cuối vào ngăn xếp Vì trỏ ln biểu diễn vị trí ngăn xếp đặt tên top Con trỏ top cung cấp cho giá trị phần tử ngăn xếp mà không cần phải thực hoạt động xóa (hoạt động pop)  Hoạt động PUSH ( thêm phần tử vào danh sách ) Tiến trình đặt (thêm) phần tử liệu vào ngăn xếp biết đến với tên Hoạt động PUSH Hoạt động push bao gồm bước sau: + Bước 1: kiểm tra xem ngăn xếp đầy hay chưa + Bước 2: ngăn xếp đầy, tiến trình bị lỗi thoát + Bước 3: ngăn xếp chưa đầy, tăng top để trỏ tới phần nhớ trống + Bước 4: thêm phần tử liệu vào vị trí nơi mà top trỏ đến ngăn xếp +Bước 5: trả success Nếu Danh sách liên kết sử dụng để triển khai ngăn xếp, bước cần cấp phát khơng gian động  Hoạt động POP ( xóa phần tử từ ngăn xếp) Việc truy cập nội dung phần tử xóa từ ngăn xếp gọi Hoạt động POP Trong triển khai Mảng hoạt động pop(), phần tử liệu khơng thực bị xóa, thay vào top bị giảm vị trí thấp ngăn xếp để trỏ tới giá trị Nhưng triển khai Danh sách liên kết, hoạt động pop() thực sụ xóa phần tử xữ liệu xóa khỏi khơng gian nhớ Hoạt động POP bao gồm bước sau: + Bước 1: kiểm tra xem ngăn xếp trống hay không + Bước 2: ngăn xếp trống, tiến trình bị lỗi + Bước 3: ngăn xếp không trống, truy cập phần tử liệu top trỏ tới + Bước 4: giảm giá trị top + Bước 5: trả success 4.2 Các hàm tốn - Hàm kiểm tra mức độ ưu tiên toán tử + Mức độ ưu tiên thấp dấu “(” + Mức độ ưu tiên thứ hai dấu “+” “-” + Mức độ ưu tiên thử ba dấu “*” “/” + Mức độ ưu tiên cao dấu mũ “^” - Hàm kiểm tra toán hạng hay toán tử Test kết II Cây nhị phân tìm kiếm Cây nhị phân tìm kiếm gì? Cây tìm kiếm nhị phân (Binary Search Tree): cấu trúc liệu sử dụng để xây dựng cấu trúc liệu trừu tượng tập hợp, đa tập hợp, dãy kết hợp, nút có quan hệ phân cấp gọi quan hệ “cha con” Có nút đặc biệt gọi nút gốc Một nhị phân có điều kiện đặc biệt nút có tối đa nút Mỗi nhị phân tận dụng dụng lợi hai kiểu cấu trúc liệu: mảng thứ tự danh sách liên kết (Linked List), việc tìm kiếm nhanh mảng thứ tự thao tác chèn xóa nhanh Linked List Node tìm kiếm nhị phân có đặc điểm chung giá trị bên phải lớn giá trị bên trái Một node tìm kiếm nhị phân bao gồm node trái – phải, key giá trị node A Con trỏ đến phần tử bên trái Giá trị Node Con trỏ đến phần tử bên phải10 Duyệt việc viếng thăm đỉnh theo thứ tự Có cách duyệt nhị phân tìm kiếm duyệt sâu duyệt rộng Cấu trúc liệu cho toán Ý tưởng chung thuật toán:  Thuật toán yêu cầu sử dụng Stack:  Operators Stack: chứa toán tử  Treenodes Stack: chứa node tạo nên cấu trúc (node gốc xây dựng từ lên)  Mơ tả thuật tốn:  Tạo phương thức phụ attachOperator() có nhiệm vụ tạo nhị phân gồm node Node gốc toán tử Pop lấy từ operators Stack, hai node toán hạng lấy từ Pop treenodes Stack Cuối đưa node gốc vào lại treenodes Stack  Lặp qua token biểu thức trung tố (infix):  Nếu toán hạng: push vào treenodes Stack   Nếu dấu mở ngoặc “( “ push vào operators Stack Nếu dấu đóng ngoặc “)”  Lặp lấy dấu mở ngoặc “(“ operators Stack Mỗi lần lặp gọi phương thức attachOperator()  Pop dấu mở ngoặc “(“ khỏi operators Stack 11  Nếu toán tử  Lặp operators Stack rỗng độ ưu tiên toán tử đỉnh operators Stack nhỏ độ ưu tiên toán tử Mỗi lần lặp gọi lại phương thức attachOperator ()  Push toán tử vào operators Stack  Khi hết vòng lặp operators Stack phần tử, gọi phương thức attachOperator () operators Stack rỗng Node lại cuối nodeStack node gốc nhị phân Ví dụ minh họa Ví dụ chuyển đổi biểu thức trung tố sau thành biểu thức hậu tố: (A+B)*C-D/E 12 Bước 1: dựng biểu thức từ biểu thức trung tố Token Operators Treenodes Description ( ( {empty} Push “(“ vào operators A ( A Push “A” vào treenodes A tốn hạng + (+ A Push “+” vào operators “+” tốn tử B (+ AB Push “B” vào treenodes B tốn hạng ) {empty} + Vì gặp dấu đóng ngoặc nên: - Cho A B làm node + - Push + treenodes, pop dấu mở ngoặc “(“ khỏi operators * * + Vì * toán tử nên push vào operators C * +C Push C vào treenodes C tốn hạng - - * Vì tốn tử – có độ ưu tiên thấp toán tử * đỉnh stack operators nên gọi phương thức tạo con: Đưa + C làm node * Push * vào treenodes D - *D Đưa D vào treenodes D tốn hạng / -/ *D Đưa / vào operators / toán tử E -/ *DE Đưa E vào treenodes E tốn hạng {empty } -/ *DE Kết thúc vòng lặp 13 - */ Đưa D E làm node / Đưa / vào treenodes {empty} - Đưa * / làm node – Đưa – vào treenodes Node – node gốc biểu thức Bước 2: duyệt biểu thức vừa tạo theo phương pháp duyệt hậu thức tự đưa biểu thức hậu tố Duyệt theo phương pháp PostOrder duyệt trái -> phải -> gốc - Bắt đầu từ node gốc – ta thăm trái Gặp node *, tiếp tục thăm trái node * ta gặp node + Vì node + có trái nên ta tiếp tục thăm trái + node A.Vì node A node khơng có nên ta in giá trị node Vậy kết biểu thức hậu tố ouput = A - Sau duyệt hết trái ta chuyển sang phải + ta chuyển sang thăm phải B Vì B node khơng có nên ta in giá trị node đưa vào chuỗi kết ouput = A B - Sau duyệt hết trái phải + ta tiến hành thăm node cha in giá trị node gốc thêm vào chuỗi output = A B + 14 - Sau thăm hết trái node * ta thăm phải C Vì C node khơng có trái phải nên ta in giá trị node thêm vào chuỗi kết ouput = A B + C - Sau duyệt xong trái phải * ta tiến hành thăm node cha * in giá trị thêm vào output = A B + C * - Sau thăm hết trái node gốc – ta tiến hành thăm phải Gặp node /, tiếp tục thăm trái / D Vì D khơng có nên ta in giá trị node thêm vào chuỗi output = A B + C * D - Tiếp tục thăm phải / gặp node E Vì node E khơng có nên ta in giá trị node thêm vào chuỗi output = A B + C * D E - Sau thăm hết / ta tiến hành thăm node cha / tiến hành in giá trị node thêm vào chuỗi output = A B + C * D E / - Cuối duyệt hết trái phải node gốc -, ta tiến hành duyệt node gốc in giá trị thêm vào chuỗi output = A B + C * DE/- Kết việc chuyển đổi là: A B + C * D E / Các hàm sử dụng toán  Cấu trúc liệu lưu trữ  Stackinput: lưu trữ biểu thức nhập vào  Stacktreenodes: lưu trữ node tạo nên cấu trúc  Stackoperators: stack lưu trữ toán tử  Hàm xử lý  Struct Node: khai báo cấu trúc Node 15  Int priority(char op): trả độ ưu tiên toán tử, ‘+’ ‘-‘ trả 1, cịn ‘*’ ‘/’ trả  Node* newNode(char data): tạo node có giá trị data Node khơng có trái phải  Void attachOperator(stack&treenodes, stackoperators): dùng để tạo từ stack lưu trữ toán tử toán hạng dùng để tạo cấu trúc 16  Void postOrder(Node* root): dùng để duyệt biểu thức tạo cho biểu thức hậu tố  Quá trình tạo biểu thức  Dùng vòng for để đưa phần tử biểu thức trung tố nhập vào stack input  Dùng vòng while(với input khác rỗng) để lặp qua phần tử có stack input, dùng top() để lấy phần tử ra, dùng biến temp để lưu lại giá trị lấy từ đỉnh input stack 17  Dùng if để kiểm tra xem phần tử vừa lấy toán hạng (số, chữ) toán tử, dấu mở ngoặc ”)”, dấu đóng ngoặc “(“  Nếu tốn hạng đưa vào stack treenodes tạo node có giá trị data đưa vào giá trị phần tử xét biến temp  Nếu dấu đóng ngoặc đưa vào stack operators tạo node  Nếu toán tử (+ - * /) tiến hành lặp stack operators rỗng tốn tử có độ ưu tiên lớn độ ưu tiên toán tử top() stack, lần gọi phương thức tạo attachOperator Sau push tốn tử vào stack operators Để thực vịng lặp, ta kiểm tra xem toán tử push vào operators stack chưa, chưa tiến hành kiểm tra điều kiện độ ưu tiên - Nếu stack operators rỗng tiến hành tạo node push vào stack - Ngược lại, phần tử top() stack operators dấu đóng ngoặc tến hành tạo node push phần tử vào stack - Ngược lại phần tử có độ ưu tiên lớn phần tử top() tạo node push vào stack 18 - Ngược lại ta gọi phương thức tạo con, kết thúc vòng lặp while  Nếu phần tử đọc từ stack input dấu mở ngoặc lặp lấy dấu đóng ngoặc stack operators Mỗi lần lặp gọi phương thức tạo attachOperator Kết thúc vòng lặp pop() dấu đóng ngoặc khỏi stack 19  Khi kiểm tra hết phần tử stack input, tiến hành gọi phương thức gọi tạo stack operator rỗng, Node lại cuối node gốc biểu thức Test kết Kết chương trình sau cài đặt III Hàng đợi Hàng đợi hì?  Hàng đợi kiểu danh sách trang bị hai phép toán bổ sung phần tử vào cuối danh sách loại bỏ phần tử đầu danh sách 20  Trong sống thường xuyên gặp hàng, ví dụ hàng người xếp chờ mua vé xem phim Người ta vào hàng cuối hàng người phục vụ khỏi hàng người đầu hàng, vào trước phục vụ trước Vì hàng đợi gọi danh sách FIFO ( Fisrt In First Out) vào trước trước  Các phép toán hàng đợi: ₋ Khởi tạo hàng đợi rỗng: InitQueue( Queue), ₋ Kiểm tra hàng đợi rỗng: isEmpty( Queue), ₋ Thêm phần tử vào hàng đợi: Put(Queue,item), ₋ Lấy phần tử khỏi hàng: Get( Queue)  Có hai 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) Ứng dụng gián tiếp: Cấu trúc liệu phụ trợ cho thuật tốn Ứng dụng Queue kí pháp Ba Lan  Thuật toán chuyển biểu thức trung tố sang biểu thức hậu tố: Giả sử cho biểu thức trung tố E  Bước 1: đọc phần tử biểu thức E (từ trái qua phải), giả sử phần tử x ₋ Nếu x tốn hạng viết vào biểu thức E1( kết quả) ₋ Nếu x dấu ‘(’ đưa vào stack ₋ Nếu x tốn tử ‘+’, ‘-’, ‘*’,’/’ xét độ ưu tiên Giả sử phần tử cần xét y 21 + y>=x loại y khỏi stack đẩy y E1 + y

Ngày đăng: 03/07/2020, 16:54

Từ khóa liên quan

Mục lục

  • A. Giới thiệu chung

    • 1. Định nghĩa về biểu thức trung tố và biểu thức hậu tố?

    • 2. Phân công nhiệm vụ

    • 3. Các cấu trúc dữ liệu được sử dụng

    • B. Cài đặt trên những cấu trúc dữ liệu cụ thể

      • I. Cấu trúc ngăn xếp (Stack)

        • 1. Ngăn xếp là gì?

        • 2. Thuật toán chung của bài toán

        • 3. Ví dụ minh họa

        • 4. Các hàm cụ thể

          • 4.1. Các hoạt động cơ bản của Stack

          • 4.2. Các hàm chính của bài toán

          • 5. Test kết quả

          • II. Cây nhị phân tìm kiếm

            • 1. Cây nhị phân tìm kiếm là gì?

            • 2. Cấu trúc dữ liệu cho bài toán

            • 3. Ví dụ minh họa

            • 4. Các hàm sử dụng trong bài toán

            • 5. Test kết quả

            • III. Hàng đợi

              • 1. Hàng đợi là hì?

              • 2. Ứng dụng của Queue trong kí pháp Ba Lan

              • 3. Các hàm sử dụng

              • 4. Test kết quả

Tài liệu cùng người dùng

Tài liệu liên quan