Tải bản đầy đủ (.pptx) (26 trang)

cấu trúc dữ liệu ngăn xếp stack

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (754.06 KB, 26 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>Cấu trúc dữ liệu </b>

<b>ngăn xếp - Stack</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>1. Khái niệm Stack</b>

<small>▪Khi muốn cho cầu vào trong hộp ta sẽ cho cầu vào đáy hộp cầu và khi muốn lấy cầu ra thì ta sẽ lấy quả cầu gần nhất được cho vào.</small>

<i><b><small>More info on how to use this template at www.slidescarnival.com/help-use-presentation-template</small></b></i>

<i><small>This template is free to use under Creative Commons Attribution license. You can keep the Credits slide or mention SlidesCarnival and other resources used in a slide footer.</small></i>

<small>▪</small> <b><small>Stack là một cấu trúc dữ liệu hoạt động theo nguyên tắc Last In First Out</small></b>

<small>Hiểu đơn giản là phần tử sẽ được thêm vào cuối stack và khi lấy ra ta cũng sẽ lấy phần tử cuối stack (phần tử được thêm vào gần nhất).Một ví dụ trong thực tế của stack mà các bạn có thể dễ hình dung được đó chính là hộp cầu lông.</small>

<b><small>2</small></b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<i> Một stack sẽ hỗ trợ các thao tác cơ bản sau:</i>

 <i>Thêm phần tử vào cuối stack</i>

 <i>Loại bỏ phần tử cuối ra khỏi stack</i>

 <i>Lấy giá trị cuối trong stack</i>

 <i>Lấy kích thước stack</i>

<b><small>3</small></b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>2. Cài đặt ngăn xếp bằng mảng</b>

Chúng ta sẽ sử dụng mảng 1 chiều kiểu int làm Stack stack, một biến capacity để lưu kích thước(sức chứa) của stack và một biến top để lưu chỉ

<b>số của phần tử ở top của Stack stack. </b>

<b><small>4</small></b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>Kiểm tra stack đầy(IsFull)</b>

Hàm này sẽ kiểm tra xem stack hiện tại đã đầy hay chưa. Nếu chỉ số top của stack đang

<b>1</b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>Kiểm tra stack rỗng(IsEmpty)</b>

• <sub>Nếu như stack đang khơng có phần tử nào, ta sẽ gán </sub>chỉ số top = -1 để đánh dấu.

• <sub>Như vậy, để kiểm tra stack có đang rỗng hay không </sub>rất đơn giản. Ta chỉ cần so sánh giá trị top có phải -1 hay khơng mà thôi.

<b>2.2</b>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>2.3. Thêm phần tử vào đỉnh stack(Push)</b>

▪ Chúng ta sẽ chỉ có thể push(thêm phần tử) vào đỉnh stack khi stack chưa đầy.

▪ Nếu stack đầy, chúng ta sẽ đưa ra thông báo và không thực hiện push.▪ Ngược lại, ta sẽ tăng top lên một đơn vị và gán giá trị cho phần tử tại chỉ

số top.

<b><small>7</small></b>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

▪ Chúng ta sẽ chỉ có thể pop(xóa phần tử) khỏi đỉnh stack khi stack không trống. Nếu stack trống, chúng ta sẽ đưa ra thơng báo và khơng thực hiện pop.

<b>2.4. Xóa phần tử khỏi đỉnh stack(Pop)</b>

▪ Ngược lại, ta sẽ giảm giá trị top đi một đơn vị.

<b><small>8</small></b>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>2.5. Lấy giá trị phần tử ở đỉnh stack(Top)</b>

Để lấy giá trị phần tử ở đỉnh stack, ta có thao tác rất đơn giản:

<b><small>9</small></b>

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>2.6. Lấy số lượng phần tử stack đang có(Size)</b>

Biến top lưu chỉ số lớn nhất của stack. Như vậy, việc lấy size của stack cực kỳ đơn giản:

<b><small>10</small></b>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b> Và cuối cùng, chúng ta sẽ có 1 chương trình cài đặt stack hoàn thiện như sau:</b>

<b><small>11</small></b>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>3. Cài đặt </b>

<b>Stack sử dụng danh sách </b>

<b>liên kết</b>

<b><small>14</small></b>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>4. Chuyển biểu thức trung tố sang hậu tố</b>

<b>Bao gồm :</b>

<small>▪ Phương pháp chuyển từ biểu thức trung tố sang tiền tố và hậu tố</small>

<small>▪ Độ ưu tiên của các toán tử</small>

<small>▪ Định dạng lại biểu thức Infix trước khi chuyển đổi</small>

<small>▪ Các phương thức kiểm tra toán tử và toán </small>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Thế nào là biểu thức tiền tố, trung tố và hậu tố ?

▪ Prefix: Biểu thức tiền tố được biểu diễn bằng cách đặt toán tử lên trước các toán hạng.

▪ Ngược lại với cách Prefix, tức là các toán tử sẽ được đặt sau các hạng.

<b><small>20</small></b>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>Phương pháp chuyển từ biểu thức trung tố sang tiền tố và hậu tố</b>

• Stack

• Expression Tree (cây biểu thức)

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<b>Độ ưu tiên của các toán tử</b>

<small>▪ Một trong những điều quan trọng trước khi bắt đầu là phải tính tốn được độ ưu tiên của các tốn tử trong biểu thức nhập vào.</small>

▪ Để đơn giản ta chỉ xét các tốn tử hai ngơi và thường dùng bao gồm:

multiply (+),subtract (-), multiply (*), divide (/), Modulo (%).

▪ Theo đó các tốn tử “*, /, %” có cùng độ ưu tiên và cao hơn hai tốn tử “+, -”. Như vậy ta có phương thức lấy độ

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<b>Định dạng lại biểu thức Infix trước khi chuyển đổi</b>

<small>▪Các biểu thức Infix khi nhập vào có thể dư thừa các khoảng trắng, các kí tự không phù hợp hoặc viết sai cú pháp. </small>

<small>▪Phần kiểm tra cú pháp bạn có thể làm riêng hoặc để ln trong các thuật tốn chuyển đổi.▪Trong phần này tơi chỉ trình bày việc định dạng để các phần tử của biểu thức (toán tử, toán </small>

<small>hạng) phải được phân cách với nhau bằng một khoảng trắng. Các phần tử này tôi sẽ gọi là một token.</small>

<b><small>24</small></b>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

Cách viết trên tôi sử dụng kĩ thuật anonymous method, bạn có thể dùng lambda expression để viết và sử dụng phương thức Format() của lớp String để mã lệnh ngắn gọn hơn như sau:

<b><small>25</small></b>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b>Các phương thức kiểm tra toán tử và toán hạng:</b>

Trong thuật tốn chuyển đổi này ta cần có các phương thức kiểm tra xem một thành phần của chuỗi có phải là tốn tử hoặc tốn hạng khơng. Thay vì sử dụng các cấu trúc if hoặc switch dài dòng và bất tiện khi phát triển, ta sẽ dùng Regex để kiểm tra.

<b><small>26</small></b>

</div>

×