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

Bài giảng Kỹ thuật lập trình Ngăn xếp Hàng đợi GV. Hà Đại Dương

15 317 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

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 348,63 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng trình bày nội dung chi tiết về các thao tác với ngăn xếp và hàng đợi trong một chương trình lập trình. Mời các bạn cùng tham khảo để bổ sung thêm kiến thức, nâng cao thêm kỹ năng lập trình của mình.

Trang 1

Tuần 12 - Ngăn xếp & Hàng đợi

Giáo viên: Hà Đại Dương

duonghd@mta.edu.vn

Kỹ thuật lập trình

Bài trước

1 Kiểu có cấu trúc (structure)

2 Danh sách liên kết (linked list)

3 Ngăn xếp (Stack)

4 Hàng đợi (Queue)

Ngăn xếp - Stack

Trang 2

Khái quát

• Là một dạng danh sách “đặc biệt”: Việc thêm

(phần tử) vào và lấy (phần tử) ra đều làm ở

đỉnh ngăn xếp

• Để tạo ngăn xếp:

Có thể dùng Mảng (Sinh viên

tự nghiên cứu, BTVN)

Có thể dùng danh sách

liên kết

Các thao tác với ngăn xếp

• Khai báo

• Khởi tạo (init)

• Kiểm tra ngăn xếp rỗng (isEmpty)

• Thêm phần tử vào (push)

• Lấy phần tử ra (pop)

• Lấy giá trị phần tử trên đỉnh (get)

Khai báo

• Cấu trúc dạng bản ghi tự trỏ

Trang 3

Vấn đề

• Biến mô tả stack là một con trỏ

• Chúng ta mới dùng tham số thực cho hàm

dạng biến thường, và muốn trả về giá trị cho

tham số này thì tham số hình thức cần khai

báo dạng con trỏ hoặc tham chiếu

• Cần truyền tham số thực dạng con trỏ cho

hàm làm thế nào? -> Con trỏ (hoặc tham

chiếu??)

Ba cách khai báo tham số

Tham trị

Con trỏ

Tham chiếu

Gọi hàm Hàm với các dạng tham số đầu vào

a, b không đổi

Khởi tạo

• Khởi tạo giá trị cuối để biết điểm kết thúc của

ngăn xếp ở đâu Giá trị này thường được chọn

là NULL

• Hàm init()

Trang 4

Kiểm tra ngăn xếp rỗng

• Kiểm tra xem đã đến đáy ngăn xếp hay chưa

• Hàm isEmpty()

Thêm phần tử vào (push)

• Thêm phần tử vào đỉnh ngăn xếp

• Hàm push()

Lấy phần tử ra (pop)

• Lấy ra phần tử ở đỉnh ngăn xếp

• Hàm pop()

Trang 5

Ví dụ 1 - Đảo ngược xâu

• Đảo ngược 1 xâu ký tự, ví dụ đảo ngược

HELLO là OLLEH

• Cách làm:

1 Lấy từng ký tự của xâu vào theo thứ tự từ trái

qua phải và đẩy (push) vào ngăn xếp

2 Lần lượt lấy các ký tự ra khỏi ngăn xếp -> Được

xâu đảo ngược.

Ví dụ 1 …

Ví dụ 2 - Tính giá trị BT hậu tố

• Biểu thức trung tố:

a+b

a+b*c

• Biểu thức hậu tố:

ab+

abc*+

Trang 6

Ví dụ 2 …

Có biểu thức: 253*+ (dạng trung tố: 2+5*3)

• Tư tưởng: Tính giá trị biểu thức hậu tố:

– Đọc từ trái sang phải

• Nếu gặp toán hạng đưa vào stack

• Nếu gặp toán tử (2 ngôi) lấy hai giá trị cuối cùng trên

stack, thực hiện phép toán Đưa giá trị tính được vào

stack

– Lặp đến hết chuỗi giá trị còn lại cuối cùng trong

stack là giá trị của biểu thức

Ví dụ 2 …

• Làm từng bước với biểu thức: 253*+

• Thế nào là 1 toán hạng?

• Thế nào à 1 toán tử?

• Viết chương trình (15 phút)

Trang 7

11/22/2016 19

Ví dụ 3 - BT trung tố -> hậu tốt

• Đã tính được giá trị biểu thức hậu tố

• Nếu chuyển được từ trung tố-> hậu tố ta tính

được biểu thức viết theo cách thông thường

(trung tố) bất kỳ

Trang 8

Ví dụ 3 …

• Có biểu thức: 2+5*3 và 2*5+3

• Ý tưởng thuật toán:

– Duyệt từ trái sang nếu gặp:

• Toán hạng: đưa và chuỗi (mảng) đầu ra

• Toán tử:

– Nếu “lớn” hơn toán tử trong stack thì đưa vào stack

– Nếu “bé” hơn hoặc bằng thì lấy toán tử trong stack vào chuỗi

đầu ra đến khi gặp toán tử lớn hơn; Đưa toán tử mới vào

stack.

– Hết chuỗi, lấy toàn bộ các toán tử đưa ra chuỗi

đầu ra.

Ví dụ 3 …

• So sánh các phép toán: (*,/) > (+,-)

• Làm từng bước với 2+5*32*5+3

• Với stack trong bài toán này cần lấy giá trị (mà

không xoá) của phần tử trên đỉnh stack để so

sánh Hàm get()

Ví dụ 3 …

• Viết chương trình (15 phút)

Trang 9

Ví dụ 4 - Trong BT có dấu ()

• Biểu thức có cả dấu ( và )

• Làm như bình thường với 1 số sửa đổi:

– Duyệt từ trái sang nếu gặp:

• Toán hạng: đưa và chuỗi (mảng) đầu ra

• Toán tử:

– Nếu “lớn” hơn toán tử trong stack thì đưa vào stack

– Nếu “bé” hơn hoặc bằng thì lấy toán tử trong stack vào chuỗi

đầu ra đến khi gặp toán tử lớn hơn; Đưa toán tử mới vào

stack.

Nếu là (: đẩy ( vào stack

Nếu là ): lấy toán tử trong stack vào chuỗi đầu ra cho đến khi

gặp ( đầu tiên (Không đưa ()vào chuỗi đầu ra)

Ví dụ 4 …

• Làm từng bước với 2+(5+3)*4

Kết quả: 2,5,3,+,4,*,+

• Viết chương trình (15 phút)

Ví dụ 5 - Tính giá trị biểu thức

(Ngầm hiểu biểu thức là BT trung tố)

• Chuyển BT trung tố -> Hậu tố (1 hàm)

• Tính giá trị của BT hậu tố (1 hàm)

• Tạm giả thiết rằng: Mỗi toán hạng (và mỗi

toán tử) là 1 ký tự

• Viết chương trình (15 phút)

Trang 10

Ví dụ 6 - Tính giá trị biểu thức

• Toán hạng có thể có nhiều hơn 1 chữ số

• Ví dụ biểu thức: 123+(64-31)*32+1000

• Thực hiện:

1 Chuyển BT về dạng hậu tố BTHT (1 mảng)

2 Tính giá trị biểu thức hậu tố trên BTHT

Hàng đợi - Queue

Khái quát

• Là một dạng danh sách “đặc biệt”: Thêm

(phần tử) vào ở cuối và lấy (phần tử) ra ở đầu

hàng đợi

Trang 11

Khái quát …

• Dùng 2 con trỏ:

– Con trỏ head: lấy ra

– Con trỏtail: đẩy giá trị vào

Các thao tác với hàng đợi

• Khai báo

• Khởi tạo (init)

• Kiểm tra hàng đợi rỗng (isEmpty)

• Thêm phần tử vào (put)

• Lấy phần tử ra (get)

Khai báo

• Khai báo cấu trúc

• Khai báo biến

Trang 12

Khởi tạo

• Khởi tạo giá trị cuối để biết điểm kết thúc của

hàng đợi ở đâu Giá trị này thường được chọn

là NULL

• Hàm init()

Kiểm tra hàng đợi rỗng

• Kiểm tra xem đã hết các phần tử trong hàng

đợi hay chưa

• Hàm isEmpty()

Thêm phần tử vào (put)

• Thêm phần tử vào đuôi hàng đợi

• Hàm put()

Trang 13

11/22/2016 37

Lấy phần tử ra (get)

• Lấy ra phần tử ở đầu hàng đợi

• Hàm get()

Ví dụ 7 - Duyệt xâu ký tự

• Duyệt xâu ký tự

• Cách làm:

1 Lấy từng ký tự của xâu vào theo thứ tự từ trái

qua phải và đẩy (put) vào hàng đợi

2 Lần lượt lấy các ký tự ra khỏi hàng đợi.

Trang 14

11/22/2016 40

Ứng dụng

• Có thể dùng stack, queue để tránh đệ qui

• Một số bài toán:

– Duyệt đồ thị

• Stack: Duyệt theo chiều sâu

• Queue: Duyệt theo chiều rộng

– Tô màu một vùng với biên xác định

– …

Bài tập

Trang 15

Bài tập

1 Viết chương trình tách toán hạng, toán tử,

dấu mở đóng ngoặc của một xâu biểu thức

(trung tố)

2 Viết chương trình tính giá trị của biểu thức

nhập từ bàn phím Lưu ý các toán hạng có

thể có nhiều hơn 1 chữ số

3 Sử dụng queue giải quyết bài toán tô màu

4 Sử dụng stack giải quyết bài toán tô màu

Bài tập về nhà

1 Cài đặt các thao tác cho ngăn xếp sử dụng

mảng

2 Cài đặt các thao tác cho hàng đợi sử dụng

mảng

3 Đề xuất thuật toán, viết chương trình kiểm

tra xem 1 xâu ký tự có được viết đúng cú

pháp hay không?

Ngày đăng: 16/05/2017, 16:13

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm