Chương 4: STL Stack, Queue

1. Stack

Stack (last in, first out – LIFO): phần tử vào stack sau cùng, là phần tử được lấy ra khỏi stack trước nhất.

Các hàm thành viên của lớp stack:

Tên hàm Mô tả Kiểu trả về
empty() Kiểm tra stack rỗng true hoặc false
size() Trả về số phần tử trong stack size_type
top() Trả về giá trị phần tử ở đỉnh stack <T>
push(<T>) Đưa một phần tử vào stack void
pop() Xóa phần tử ở đỉnh stack void

2. Queue

Queue (first in, first out – FIFO): phần tử vào queue trước nhất, là phần tử được lấy ra khỏi queue trước nhất.

Các hàm thành viên của lớp queue:

Tên hàm Mô tả Kiểu trả về
empty() Kiểm tra queue rỗng true hoặc false
size() Trả về số phần tử trong queue size_type
front Trả về giá trị phần tử đầu queue <T>
back Trả về giá trị phần tử cuối queue <T>
push(<T>) Thêm một phần tử vào cuối queue void
push_back(<T>)
pop() Xóa phần tử đầu queue void
pop_front()

3. Bài tập

Bài tập 1:

Thực hiện đổi từ cơ số 10 sang cơ số X (dùng stack).

Bài tập 2:

Cài đặt chương trình định giá trị của một biểu thức toán học thông thường (ở dạng trung tố - Infix). Trong đó, biểu thức toán học bao gồm các số nguyên không âm (>= 0), các phép toán + - * / (cộng, trừ, nhân và chia) và dấu ngoặc ( ).

Ví dụ:

INFIX : 3+4*2/(1-5)

POSTFIX : 3 4 2 * 1 5 - / +

Value : 1

Hướng dẫn:

Bước 1: Chuyển từ Trung tố sang Hậu tố:

Thuật toán chuyển đổi biểu thức từ trung tố sang hậu tố:

  • Nếu gặp 1 toán hạng (con số hoặc biến) thì nó ghi vào kết quả (chuỗi kết quả là biểu thức hậu tố).
  • Nếu gặp dấu mở ngoặc thì đưa nó vào stack.
  • Nếu gặp 1 toán tử (ví dụ là t1) thì thực hiện 2 bước sau:

    • Nếu stack rỗng hoặc toán tử t2 ở đỉnh stack có độ ưu tiên thấp hơn t1 thì ghi (push) t1vào ngăn xếp.
    • Nếu stack không rỗng, và còn toán tử t2 ở đỉnh ngăn xếp mà độ ưu tiên của t1 nhỏ hơn hay bằng độ ưu tiên của t2 thì lấy t2 ra khỏi ngăn xếp và ghi vào kết quả. Sau đó thêm t1 vào ngăn xếp.
  • Nếu gặp dấu đóng ngoặc thì cứ lấy các tất cả các toán tử trong ngăn xếp ra và ghi vào kết quả cho đến khi lấy được dấu mở ngoặc ra khỏi ngăn xếp (không ghi).

  • Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả toán tử (nếu có) từ ngăn xếp và ghi vào chuỗi kết quả.

function INFIXTOPOSTFIX (Expression P) return Expression Q

Khai báo biến ngăn xếp S

while (chưa hết biểu thức P)

Lấy 1 kí tự x trong P (theo thứ tự trái qua phải)

if (x là số)

Thêm x vào Q

if (x là dấu mở ngoặc)

S.Push(x)

if (x là toán tử)

while( thứ tự ưu tiên S.TOP() >= x)

w <- S.POP ()

Thêm w vào Q

S.Push(x)

if (x là dấu đóng ngoặc ‘)’ )

while(chưa gặp dấu mở ngoặc ‘(‘ )

w <- S.POP ()

Thêm w vào Q

S.POP ()//đẩy mở ngoặc ra khỏi stack

while(! S.IsEmpty())

w <- S.POP ()

if(w không là mở ngoặc)

Thêm w vào Q

Bước 2: Định giá trị biểu thức:

function CALCULATEPOSTFIX (Expression Q) return value

Khai báo biến ngăn xếp S

foreach chuỗi x trong biểu thức Q do

if(x là số)

S.Push(x)

if (x là toán tử)

w1 = S.POP ()

w2 = S.POP ()

GiaTri = PHEPTOAN(w2, w1) //tính kết quả phép toán

S.Push(GiaTri)

value <- S.POP () //lúc này ngăn xếp chỉ còn lại 1 giá trị duy nhất

Bài tập 3:(*)

Cài đặt thuật toán Quick Sort dùng Stack để khử đệ quy.

results matching ""

    No results matching ""