Hàng đợi là như thế nào

Ngăn xếp (Sack) và Hàng đợ (Quu) là ha rong số những cấu rúc ữ lệu cực kỳ quan rọng, được sử ụng hường xuyên rong hế kế huậ oán. Ch́nh máy ́nh cũng sử ụng nhều ứng ụng của ngăn xếp (chẳng hạn như vệc quản lý bộ nhớ rong kh h hành chương r̀nh, hay lưu rữ các lờ gọ đệ quy,...). Về bản chấ, ngăn xếp và hàng đợ cũng gống như mảng, chúng là mộ ập hợp các phần ử cùng kểu ữ lệu, nhưng được lưu rữ có ́nh hứ ự.

Trong chuyên đề này, ô s̃ gớ hệu ớ các bạn về hoạ động của ngăn xếp và hàng đợ, cũng như cách cà đặ chúng hậ đơn gản. Ngoà ra, chúng a cũng s̃ cùng xm x́ mộ số bà oán ứng ụng ha cấu rúc ữ lệu này để hểu rõ hơn về cách sử ụng chúng.

Để cho đơn gản, a s̃ hống nhấ gọ yp\x{yp}yp là kểu ữ lệu của các phần ử rong ngăn xếp và hàng đợ. Kh cà đặ cụ hể, yp\x{yp}yp có hể là kểu số, kểu chữ hay hậm ch́ là mộ kểu cấu rúc o ngườ ùng ự đ̣nh ngh̃a.

II. Ngăn xếp (Sack)

1. Khá nệm

Ngăn xếp là mộ kểu anh sách mà vệc bổ sung mộ phần ử và xóa mộ phần ử được hực hện ở cuố anh sách.

Hãy h̀nh ung ngăn xếp gống như mộ chồng đ̃a. Các bạn muốn hêm mộ chếc đ̃a vào h̀ phả đặ nó lên đ̉nh của chồng đ̃a (ph́a cuố), và muốn lấy mộ chếc đ̃a ra h̀ cũng phả lấy ừ rên xuống.

Phần ử ở đ̉nh ngăn xếp (cuố anh sách) được gọ là phần ử op của ngăn xếp. Nguyên ắc hêm - xóa phần ử như rên được gọ là "vào sau ra rước", o đó ngăn xếp còn có ên gọ khác là anh sách kểu LIFO (Las In Frs Ou). Có 666 hao ác cơ bản ngăn xếp cung cấp:

    n\x{n}n: Khở ạo ngăn xếp rỗng.s_mpy\x{s\_mpy}s_mpy: Kểm ra xm ngăn xếp có rỗng không.s_full\x{s\_full}s_full: Kểm ra xm ngăn xếp có ḅ đầy (ràn) hay không.g_op\x{g\_op}g_op: Trả về phần ử ở đ̉nh ngăn xếp.push\x{push}push: Thêm mộ phần ử vào ngăn xếp.pop\x{pop}pop: Lấy ra phần ử ở đ̉nh ngăn xếp.

Có ha cách để bểu ễn ngăn xếp là sử ụng mảng hoặc anh sách lên kế, uy nhên o những ngôn ngữ hện đạ như C++ và Pyhon đã không còn ưu ên sử ụng anh sách lên kế, cũng như đã cà đặ sẵn sack và quu, nên ở đây ô ch̉ phân ́ch sơ qua cách cà đặ bằng mảng để bạn đọc hểu về cơ chế của cấu rúc ữ lệu này.

2. Bểu ễn ngăn xếp bằng mảng

Để bểu ễn ngăn xếp, a sử ụng mộ mảng lmns\x{lmns}lmns để lưu các phần ử của ngăn xếp, phần ử cuố cùng của mảng ch́nh là phần ử op của ngăn xếp. Conanrs

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 4 rong C++ và

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5 rong Pyhon ễ àng kểm soá đều này.

Tuy nhên, v̀

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 4 rong C++ và

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5 rong Pyhon hường được cấp phá bộ nhớ rấ lớn rong máy ́nh, nên vệc kểm ra ngăn xếp có ḅ đầy hay không là không cần hế. V̀ vậy, ở đây ô s̃ không cà đặ hao ác s_full\x{s\_full}s_full.

Ngôn ngữ C++:

#nclu &l;osram&g; #nclu &l;vcor&g; usng namspac s; // Tạo mộ cấu rúc ngăn xếp là mộ vcor có kểu phần ử yp. ypf vcor &l; {yp} &g; sack_yp; // Khở ạo ngăn xếp rỗng. vo cra_sack(sack_yp &s) { s.rsz(0); } // Kểm ra ngăn xếp có rỗng không. bool s_mpy(sack_yp &s) { rurn s.mpy(); } // Trả ra phần ử ở đ̉nh ngăn xếp nếu ồn ạ. {yp} g_op(sack_yp &s) { f (!s.mpy()) rurn s.lmns.back(); ls {Báo_lỗ_ngăn_xếp_rỗng}; } // Đẩy mộ phần ử vào ngăn xếp. vo push(sack_yp &s, {yp} x) { sack.push_back(x); } // Lấy ra phần ử ở đ̉nh ngăn xếp. vo pop(sack_yp &s) { rurn s.pop_back(); }

Ngôn ngữ Pyhon:

# Khở ạo ngăn xếp rỗng. f cra_sack(s): s = [] # Kểm ra ngăn xếp có rỗng không. f s_mpy(s): rurn ln(s) == 0 # Trả về phần ử ở đ̉nh ngăn xếp. f g_op(s): f ln(s) &g; 0: rurn s[-1] ls: {Báo_lỗ_ngăn_xếp_rỗng} # Thêm mộ phần ử vào ngăn xếp. f push(s, x): s.appn(x) # Xóa phần ử ở đ̉nh ngăn xếp. f pop(s): s.pop() III. Hàng đợ (Quu)

1. Khá nệm

Gống như ên gọ của m̀nh, hàng đợ là mộ cấu rúc ữ lệu bểu ễn mộ anh sách các phần ử đứng rong "hàng chờ" được xử lý. Trong cấu rúc ữ lệu này, vệc bổ sung mộ phần ử được hực hện ở cuố anh sách, còn vệc loạ bỏ mộ phần ử được hực hện ở đầu anh sách.

Có hể ưởng ượng hàng đợ gống như mộ hàng ngườ xếp hàng chờ mua v́, a đến rước được mua rước và rờ khỏ hàng, còn những ngườ đến sau s̃ bổ sung vào cuố hàng. V̀ nguyên ắc "vào rước ra rước" như vậy nên hàng đợ còn được gọ là anh sách kểu FIFO (Frs In Frs Ou).

Phần ử ở đầu hàng đợ s̃ gọ là phần ử fron, còn phần ử ở cuố hàng đợ gọ là phần ử rar. Tương ự như ngăn xếp, có 666 hao ác cơ bản rên hàng đợ:

    n\x{n}n: Khở ạo mộ hàng đợ rỗng.s_mpy\x{s\_mpy}s_mpy: Kểm ra hàng đợ có rỗng hay không.s_full\x{s\_full}s_full: Kểm ra hàng đợ đã ḅ đầy chưa.g_fron\x{g\_fron}g_fron: Trả về gá ṛ của phần ử ở đầu hàng đợ.push\x{push}push: Đẩy mộ phần ử vào cuố hàng đợ.pop\x{pop}pop: Loạ bỏ mộ phần ử ở đầu hàng đợ.

2. Bểu ễn hàng đợ bằng mảng

Gống như ngăn xếp, a sử ụng mộ mảng lmns\x{lmns}lmns để lưu các phần ử của hàng đợ. Tuy nhên, a phả sử ụng hêm mộ bến fron\x{fron}fron để kểm soá ṿ ŕ của phần ử đầu ên rong hàng đợ, còn phần ử cuố cùng h̀ vẫn là phần ử cuố của

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 4 hoặc

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5. Tương ự như ngăn xếp, hao ác kểm ra s_full\x{s\_full}s_full cũng không cần hế phả cà đặ.

Ý ưởng s̃ là, nếu như hêm mộ phần ử vào hàng đợ h̀ đẩy nó vào cuố anh sách lmns,\x{lmns},lmns, còn kh lấy ra mộ phần ử ở đầu hàng đợ h̀ a ăng bến fron\x{fron}fron hêm 111 đơn ṿ, như vậy co như các phần ử ừ ṿ ŕ 000 ớ ṿ ŕ fron−1\x{fron} - 1fron1 rên mảng là các phần ử đã ḅ loạ đ.

Cả ha hành phần rên có hể gộp lạ hành mộ cấu rúc quu_yp\x{quu\_yp}quu_yp rong C++, hoặc mộ class quu_yp\x{quu\_yp}quu_yp rong Pyhon.

Ngôn ngữ C++:

#nclu &l;osram&g; #nclu &l;vcor&g; usng namspac s; cons n max_sz = {Ḱch_hước_cực_đạ}; sruc quu_yp { vcor &l; {yp} &g; lmns; n fron; } // Khở ạo hàng đợ. vo n(quu_yp &qu) { qu.lmns.rsz(0); fron = -1; } // Kểm ra hàng đợ có rỗng không. bool s_mpy(quu_yp &qu) { rurn qu.fron &g; qu.lmns.sz(); } // Trả về phần ử ở đầu hàng đợ. {yp} g_fron(quu_yp qu) { f (s_mpy(qu)) {Báo_lỗ_hàng_đợ_rỗng}; ls rurn qu.lmns[qu.fron]; } // Thêm mộ phần ử vào hàng đợ. vo push(quu_yp &qu, {yp} x) { qu.lmns.push_back(x); } // Xóa phần ử ở đầu hàng đợ. vo pop(quu_yp &qu) { f (s_mpy(qu)) {Báo_lỗ_hàng_đợ_rỗng}; ls ++qu.fron; }

Ngôn ngữ Pyhon:

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron IV. Sử ụng

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 ựng sẵn rong C++ và Pyhon

Trên hực ế, rong các ngôn ngữ lập r̀nh bậc rung và bậc cao đều đã xây ựng sẵn ha cấu rúc ữ lệu ngăn xếp và hàng đợ để ế kệm hờ gan cho lập r̀nh vên. Trong các k̀ h lập r̀nh, hay rong công vệc, chúng a cũng không cần hế phả cà đặ hủ công ha cấu rúc ữ lệu này mà ch̉ cần sử ụng sẵn là được.

1. Trong hư vện STL C++

Thư vện mpla chuẩn C++ (STL) cung cấp sẵn ha conanr

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 bểu ễn ha cấu rúc ữ lệu ngăn xếp và hàng đợ. Để sử ụng, các bạn cần kha báo hư vện

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 cùng vớ không gan ên

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 6. Sau đó, cú pháp kha báo hàng đợ và ngăn xếp như sau:

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ};

Các hàm ựng sẵn của ha conanrs này được cho ở bảng ướ đây. Để sử ụng các hàm đó, các bạn sử ụng cú pháp:

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 7.

Ngoà ra rong STL C++ cũng hỗ rợ mộ conanr nữa là

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8 (hàng đợ ha đầu), là sự kế hợp gữa

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1. Cách kha báo hoàn oàn ương ự:

#nclu &l;qu&g; usng namspac s; // Kha báo mộ quu qu &l; {Kểu_phần_ử} &g; {Tên_hàng_đợ_ha_đầu};

Các hàm ựng sẵn hông ụng của conanrs

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8 được cho rong bảng ướ đây:

Vblo Algorhm @vblo.algorhm

Tho õ

5.6K 428 89

Đã đăng vào hg 9 24, 2021 7:58 SA 13 phú đọc

1.8K

0

2

Ngăn xếp và Hàng đợ (Sack & Quu)

    Báo cáoThêm vào srs của ô

I. Lờ mở đầu

Ngăn xếp (Sack) và Hàng đợ (Quu) là ha rong số những cấu rúc ữ lệu cực kỳ quan rọng, được sử ụng hường xuyên rong hế kế huậ oán. Ch́nh máy ́nh cũng sử ụng nhều ứng ụng của ngăn xếp (chẳng hạn như vệc quản lý bộ nhớ rong kh h hành chương r̀nh, hay lưu rữ các lờ gọ đệ quy,...). Về bản chấ, ngăn xếp và hàng đợ cũng gống như mảng, chúng là mộ ập hợp các phần ử cùng kểu ữ lệu, nhưng được lưu rữ có ́nh hứ ự.

Trong chuyên đề này, ô s̃ gớ hệu ớ các bạn về hoạ động của ngăn xếp và hàng đợ, cũng như cách cà đặ chúng hậ đơn gản. Ngoà ra, chúng a cũng s̃ cùng xm x́ mộ số bà oán ứng ụng ha cấu rúc ữ lệu này để hểu rõ hơn về cách sử ụng chúng.

Để cho đơn gản, a s̃ hống nhấ gọ yp\x{yp}yp là kểu ữ lệu của các phần ử rong ngăn xếp và hàng đợ. Kh cà đặ cụ hể, yp\x{yp}yp có hể là kểu số, kểu chữ hay hậm ch́ là mộ kểu cấu rúc o ngườ ùng ự đ̣nh ngh̃a.

II. Ngăn xếp (Sack)

1. Khá nệm

Ngăn xếp là mộ kểu anh sách mà vệc bổ sung mộ phần ử và xóa mộ phần ử được hực hện ở cuố anh sách.

Hãy h̀nh ung ngăn xếp gống như mộ chồng đ̃a. Các bạn muốn hêm mộ chếc đ̃a vào h̀ phả đặ nó lên đ̉nh của chồng đ̃a (ph́a cuố), và muốn lấy mộ chếc đ̃a ra h̀ cũng phả lấy ừ rên xuống.

Phần ử ở đ̉nh ngăn xếp (cuố anh sách) được gọ là phần ử op của ngăn xếp. Nguyên ắc hêm - xóa phần ử như rên được gọ là "vào sau ra rước", o đó ngăn xếp còn có ên gọ khác là anh sách kểu LIFO (Las In Frs Ou). Có 666 hao ác cơ bản ngăn xếp cung cấp:

    n\x{n}n: Khở ạo ngăn xếp rỗng.s_mpy\x{s\_mpy}s_mpy: Kểm ra xm ngăn xếp có rỗng không.s_full\x{s\_full}s_full: Kểm ra xm ngăn xếp có ḅ đầy (ràn) hay không.g_op\x{g\_op}g_op: Trả về phần ử ở đ̉nh ngăn xếp.push\x{push}push: Thêm mộ phần ử vào ngăn xếp.pop\x{pop}pop: Lấy ra phần ử ở đ̉nh ngăn xếp.

Có ha cách để bểu ễn ngăn xếp là sử ụng mảng hoặc anh sách lên kế, uy nhên o những ngôn ngữ hện đạ như C++ và Pyhon đã không còn ưu ên sử ụng anh sách lên kế, cũng như đã cà đặ sẵn sack và quu, nên ở đây ô ch̉ phân ́ch sơ qua cách cà đặ bằng mảng để bạn đọc hểu về cơ chế của cấu rúc ữ lệu này.

2. Bểu ễn ngăn xếp bằng mảng

Để bểu ễn ngăn xếp, a sử ụng mộ mảng lmns\x{lmns}lmns để lưu các phần ử của ngăn xếp, phần ử cuố cùng của mảng ch́nh là phần ử op của ngăn xếp. Conanrs

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 4 rong C++ và

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5 rong Pyhon ễ àng kểm soá đều này.

Tuy nhên, v̀

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 4 rong C++ và

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5 rong Pyhon hường được cấp phá bộ nhớ rấ lớn rong máy ́nh, nên vệc kểm ra ngăn xếp có ḅ đầy hay không là không cần hế. V̀ vậy, ở đây ô s̃ không cà đặ hao ác s_full\x{s\_full}s_full.

Ngôn ngữ C++:

#nclu &l;osram&g; #nclu &l;vcor&g; usng namspac s; // Tạo mộ cấu rúc ngăn xếp là mộ vcor có kểu phần ử yp. ypf vcor &l; {yp} &g; sack_yp; // Khở ạo ngăn xếp rỗng. vo cra_sack(sack_yp &s) { s.rsz(0); } // Kểm ra ngăn xếp có rỗng không. bool s_mpy(sack_yp &s) { rurn s.mpy(); } // Trả ra phần ử ở đ̉nh ngăn xếp nếu ồn ạ. {yp} g_op(sack_yp &s) { f (!s.mpy()) rurn s.lmns.back(); ls {Báo_lỗ_ngăn_xếp_rỗng}; } // Đẩy mộ phần ử vào ngăn xếp. vo push(sack_yp &s, {yp} x) { sack.push_back(x); } // Lấy ra phần ử ở đ̉nh ngăn xếp. vo pop(sack_yp &s) { rurn s.pop_back(); }

Ngôn ngữ Pyhon:

# Khở ạo ngăn xếp rỗng. f cra_sack(s): s = [] # Kểm ra ngăn xếp có rỗng không. f s_mpy(s): rurn ln(s) == 0 # Trả về phần ử ở đ̉nh ngăn xếp. f g_op(s): f ln(s) &g; 0: rurn s[-1] ls: {Báo_lỗ_ngăn_xếp_rỗng} # Thêm mộ phần ử vào ngăn xếp. f push(s, x): s.appn(x) # Xóa phần ử ở đ̉nh ngăn xếp. f pop(s): s.pop() III. Hàng đợ (Quu)

1. Khá nệm

Gống như ên gọ của m̀nh, hàng đợ là mộ cấu rúc ữ lệu bểu ễn mộ anh sách các phần ử đứng rong "hàng chờ" được xử lý. Trong cấu rúc ữ lệu này, vệc bổ sung mộ phần ử được hực hện ở cuố anh sách, còn vệc loạ bỏ mộ phần ử được hực hện ở đầu anh sách.

Có hể ưởng ượng hàng đợ gống như mộ hàng ngườ xếp hàng chờ mua v́, a đến rước được mua rước và rờ khỏ hàng, còn những ngườ đến sau s̃ bổ sung vào cuố hàng. V̀ nguyên ắc "vào rước ra rước" như vậy nên hàng đợ còn được gọ là anh sách kểu FIFO (Frs In Frs Ou).

Phần ử ở đầu hàng đợ s̃ gọ là phần ử fron, còn phần ử ở cuố hàng đợ gọ là phần ử rar. Tương ự như ngăn xếp, có 666 hao ác cơ bản rên hàng đợ:

    n\x{n}n: Khở ạo mộ hàng đợ rỗng.s_mpy\x{s\_mpy}s_mpy: Kểm ra hàng đợ có rỗng hay không.s_full\x{s\_full}s_full: Kểm ra hàng đợ đã ḅ đầy chưa.g_fron\x{g\_fron}g_fron: Trả về gá ṛ của phần ử ở đầu hàng đợ.push\x{push}push: Đẩy mộ phần ử vào cuố hàng đợ.pop\x{pop}pop: Loạ bỏ mộ phần ử ở đầu hàng đợ.

2. Bểu ễn hàng đợ bằng mảng

Gống như ngăn xếp, a sử ụng mộ mảng lmns\x{lmns}lmns để lưu các phần ử của hàng đợ. Tuy nhên, a phả sử ụng hêm mộ bến fron\x{fron}fron để kểm soá ṿ ŕ của phần ử đầu ên rong hàng đợ, còn phần ử cuố cùng h̀ vẫn là phần ử cuố của

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 4 hoặc

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5. Tương ự như ngăn xếp, hao ác kểm ra s_full\x{s\_full}s_full cũng không cần hế phả cà đặ.

Ý ưởng s̃ là, nếu như hêm mộ phần ử vào hàng đợ h̀ đẩy nó vào cuố anh sách lmns,\x{lmns},lmns, còn kh lấy ra mộ phần ử ở đầu hàng đợ h̀ a ăng bến fron\x{fron}fron hêm 111 đơn ṿ, như vậy co như các phần ử ừ ṿ ŕ 000 ớ ṿ ŕ fron−1\x{fron} - 1fron1 rên mảng là các phần ử đã ḅ loạ đ.

Cả ha hành phần rên có hể gộp lạ hành mộ cấu rúc quu_yp\x{quu\_yp}quu_yp rong C++, hoặc mộ class quu_yp\x{quu\_yp}quu_yp rong Pyhon.

Ngôn ngữ C++:

#nclu &l;osram&g; #nclu &l;vcor&g; usng namspac s; cons n max_sz = {Ḱch_hước_cực_đạ}; sruc quu_yp { vcor &l; {yp} &g; lmns; n fron; } // Khở ạo hàng đợ. vo n(quu_yp &qu) { qu.lmns.rsz(0); fron = -1; } // Kểm ra hàng đợ có rỗng không. bool s_mpy(quu_yp &qu) { rurn qu.fron &g; qu.lmns.sz(); } // Trả về phần ử ở đầu hàng đợ. {yp} g_fron(quu_yp qu) { f (s_mpy(qu)) {Báo_lỗ_hàng_đợ_rỗng}; ls rurn qu.lmns[qu.fron]; } // Thêm mộ phần ử vào hàng đợ. vo push(quu_yp &qu, {yp} x) { qu.lmns.push_back(x); } // Xóa phần ử ở đầu hàng đợ. vo pop(quu_yp &qu) { f (s_mpy(qu)) {Báo_lỗ_hàng_đợ_rỗng}; ls ++qu.fron; }

Ngôn ngữ Pyhon:

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron IV. Sử ụng

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 ựng sẵn rong C++ và Pyhon

Trên hực ế, rong các ngôn ngữ lập r̀nh bậc rung và bậc cao đều đã xây ựng sẵn ha cấu rúc ữ lệu ngăn xếp và hàng đợ để ế kệm hờ gan cho lập r̀nh vên. Trong các k̀ h lập r̀nh, hay rong công vệc, chúng a cũng không cần hế phả cà đặ hủ công ha cấu rúc ữ lệu này mà ch̉ cần sử ụng sẵn là được.

1. Trong hư vện STL C++

Thư vện mpla chuẩn C++ (STL) cung cấp sẵn ha conanr

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 bểu ễn ha cấu rúc ữ lệu ngăn xếp và hàng đợ. Để sử ụng, các bạn cần kha báo hư vện

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 cùng vớ không gan ên

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 6. Sau đó, cú pháp kha báo hàng đợ và ngăn xếp như sau:

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ};

Các hàm ựng sẵn của ha conanrs này được cho ở bảng ướ đây. Để sử ụng các hàm đó, các bạn sử ụng cú pháp:

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 7.

Ngoà ra rong STL C++ cũng hỗ rợ mộ conanr nữa là

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8 (hàng đợ ha đầu), là sự kế hợp gữa

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1. Cách kha báo hoàn oàn ương ự:

#nclu &l;qu&g; usng namspac s; // Kha báo mộ quu qu &l; {Kểu_phần_ử} &g; {Tên_hàng_đợ_ha_đầu};

Các hàm ựng sẵn hông ụng của conanrs

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8 được cho rong bảng ướ đây:

2. Trong Pyhon

Đố vớ Pyhon, a có khá nhều cách để bểu ễn ha cấu rúc ữ lệu này. Ngăn xếp và hàng đợ được xây ựng sẵn rong 333 class là

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5,

#nclu &l;qu&g; usng namspac s; // Kha báo mộ quu qu &l; {Kểu_phần_ử} &g; {Tên_hàng_đợ_ha_đầu}; 3 và

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1. Tuy nhên, cách xây ựng bằng

# Tạo mộ class bểu ễn hàng đợ. class quu_yp: f __n__(sfl, lmns, fron): slf.lmns = lmns slf.fron = fron # Khở ạo hàng đợ rỗng. f n(quu_yp qu): qu.lmns = [] qu.fron = -1 # Kểm ra hàng đợ có rỗng không. f s_mpy(quu_yp qu): rurn ln(qu.lmns) == 0 # Trả về phần ử ở đầu hàng đợ. f g_fron(quu_yp qu): f ln(qu.lmns) == 0: {Báo_lỗ_hàng_đợ_rỗng} ls: rurn qu.lmns[qu.fron] # Thêm mộ phần ử vào hàng đợ. f push(quu_yp qu, x): qu.lmns.appn(x) # Xóa đ phần ử ở đầu hàng đợ. f pop(quu_yp qu): f s_mpy(qu): {Báo_lỗ_hàng_đợ_rỗng} ls: ++qu.fron 5 không ố ưu về mặ hờ gan hực h, nên ô s̃ không đề cập ở đây.

Nếu như các bạn xây ựng ngăn xếp và hàng đợ bằng class

#nclu &l;qu&g; usng namspac s; // Kha báo mộ quu qu &l; {Kểu_phần_ử} &g; {Tên_hàng_đợ_ha_đầu}; 3, h̀ nó s̃ ương ự như conanr

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8 rong C++, là sự kế hợp gữa

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 lẫn

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1. Trước ên, cần mpor class này, rồ kha báo mộ bến

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8, sử ụng làm

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 0 hay

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 1 ùy ho mục đ́ch. Đây cũng là cách được ưu ên sử ụng hường xuyên nhấ rong Pyhon.

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu()

Những phương hức được ựng sẵn hông ụng s̃ mô ả ở bảng ướ đây. Các bạn sử ụng chúng bằng cú pháp:

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu() 3

Ngoà ra còn khá nhều phương hức khác của

sack &l; {Kểu_phần_ử} &g; {Tên_bến_ngăn_xếp}; quu &l; {Kểu_phần_ử} &g; {Tên_bến_hàng_đợ}; 8 được ựng sẵn, các bạn có hể ham khảo hêm ạ đây.

Còn nếu các bạn muốn sử ụng class

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu() 5 và

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu() 6, h̀ hãy đọc hêm về chúng ở . Tuy nhên, rong class này hờ gan hực h lâu hơn, và lạ ́ ́nh năng hơn, nên nó rấ ́ kh được sử ụng.

VI. Mộ số bà oán mnh họa

1. Kểm ra ngoặc đúng

Đề bà

Cho mộ xâu sss gồm oàn các ấu ngoặc đóng và mở huộc ba loạ:

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu() 7,

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu() 8 và

from collcons mpor qu # Kha báo mộ ngăn xếp hoặc hàng đợ. {Tên_bến} = qu() 9. Xâu sss được gọ là xâu ngoặc đúng nếu như:

    Số lượng ngoặc đóng bằng số lượng ngoặc mở mỗ loạ.Tạ mọ ṿ ŕ của xâu s,s,s, số lượng đóng mỗ loạ không vượ quá số lượng ngoặc mở của loạ ương ứng.

Hãy kểm ra xâu sss có phả là mộ xâu ngoặc đúng hay không?

Inpu:

    Mộ òng uy nhấ chứa xâu sss.

Ràng buộc:

    ∣s∣≤106;|s| \l 10^6;s106; vớ ∣s∣|s|s là độ à xâu sss.

Oupu:

    In ra

    {[()]} 0 nếu sss là xâu ngoặc đúng, ngược lạ n ra

    {[()]} 1.

Sampl Inpu 1:

{[()]}

Sampl Oupu 1:

YES

Sampl Inpu 2:

{[(])}

Sampl Oupu 2:

# Khở ạo ngăn xếp rỗng. f cra_sack(s): s = [] # Kểm ra ngăn xếp có rỗng không. f s_mpy(s): rurn ln(s) == 0 # Trả về phần ử ở đ̉nh ngăn xếp. f g_op(s): f ln(s) &g; 0: rurn s[-1] ls: {Báo_lỗ_ngăn_xếp_rỗng} # Thêm mộ phần ử vào ngăn xếp. f push(s, x): s.appn(x) # Xóa phần ử ở đ̉nh ngăn xếp. f pop(s): s.pop() 0

Ý ưởng

Sử ụng 111 sack lưu rữ các ấu ngoặc. Xé kí ự hứ của chuỗ nhập vào:

    Nếu ss_s là ấu ngoặc mở hì push vào sack.Nếu ss_s là ấu ngoặc đóng, a kểm ra xm ấu ngoặc ở đ̉nh của sack có phả ngoặc mở cùng loạ không, nếu đúng hì loạ bỏ ấu ngoặc đóng khỏ sack, ngược lạ đây là xâu ngoặc không cân bằng o đã v phạm mộ vị rí →\o n

    {[()]} 1 luôn.

Sau kh uyệ hế xâu, nếu như sack rở hành rỗng hì nghĩa là số lượng ngoặc đóng bằng số lượng ngoặc mở mỗ loạ, lúc này a n ra

{[()]} 0, ngược lạ n ra

{[()]} 1.