SlideShare a Scribd company logo
8
Most read
9
Most read
10
Most read
Ngăn xếp Stack
– Cài đặt ngăn
xếp bằng mảng
code C/C++
1. Ngăn xếp – Stack là gì?
 Ngăn xếp ( Stack ) trong C ++ là một
cấu trúc dữ liệu tương tự như danh sách
liên kết đơn, hay Queue hàng đợi.
dạng danh sách liên kết đặc biệt trong
đó việc thêm vào, lấy ra phần tử chỉ
thực hiện ở một đầu của danh sách.
Đặc điểm của ngăn xếp:
 Tuân theo quy luật ” vào trước ra sau
“ hay là ” vào sau ra trước” ( FILO –
First In Last Out hoặc LIFO – Last In
First OUT )
Bạn hình dung hoạt động của cấu trúc
này tương tự như việc bạn xếp một
chồng bát, đĩa. Cách bạn thêm vào và
lấy ra chúng cho dễ hiểu.
 Ngoài ngôn ngữ lập trình C/C++, thì tất
cả các ngôn ngữ khác như Python, C#,
PHP, Java, Javascript . . . đều sử dụng
tới cấu trúc này!
1.1 Các dạng biểu diễn của ngăn
xếp
 Thực chất stack là một danh sách liên
kết , nên bạn có thể sử dụng một trong
các dạng cài đặt sau:
1. Cài đặt stack bằng danh sách liên kết
2. Biểu diễn trực tiếp ngăn xếp bằng
mảng một chiều
3. Cài đặt bằng con trỏ (sử dụng các
node stack)
1.2 Các phép toán trên ngăn xếp
 Đối với cấu trúc dữ liệu stack, bạn chắc
chắn sẽ phải sử dụng những phép toán sau:
 Tạo ngăn xếp rỗng : Hàm Init (S )
 Thêm phần tử vào đầu ngăn xếp : Hàm
Push(S,x)
 Lấy phần tử khỏi danh sách: Hàm Pop(S)
 Kiểm tra ngăn xếp rỗng: Hàm Isempty(S)
 Isfull(s) // kiem tra ds day
 Chèn phần tử vào vị trí bất kì: Hàm
Insert_k (S, x, k)
2. Ngăn xếp cài đặt bằng mảng
 Bài toán: Cài đặt ngăn xếp stack các
số nguyên, viết hàm chèn phần tử vào
vị trí bất kỳ!
2.1 Khai báo cài đặt ngăn xếp
 Ngăn xếp stack cài đặt bằng mảng
một chiều sẽ có một biến Top dùng đế
lưu vị trí hiện tại, vị trí đỉnh của ngăn
xếp.
Thành phần thứ 2 là mảng chứa Data
dữ liệu.
#i
1
2
3
4
5
6
7
8
9
include<.>
//cai dat ngan xep
typedef int item; // kieu cua ngan xep
#define Max 100 // so pt toi da cua stack
struct Stack{
int Top;
item Data[Max];
};
Stack S; // kb ngan xep S
2.2 Nhóm hàm khởi tạo và kiểm
tra
 Hàm khởi tạo ngăn xếp: Chỉ cần cho giá trị của
biến Top = 0 là xong.
Hàm kiểm tra rỗng thì ngược lại trả về đúng nếu
biến Top == 0 là được.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
// khoi tao stack
void Init (Stack & S){
S.Top = 0;
}
//kiem tra stack rong
int Isempty( Stack S){
return (S.Top==0);
}
// kiem tra stack day
int Isfull(Stack S){
return (S.Top == Max);
}
2.3 Thêm phần tử vào đầu stack
– Hàm Push
 Hàm Push dùng để thêm phần tử vào đầu ngăn
xếp.
Nếu ngăn xếp đã đầy thì không cho phép thêm,
còn ngược lại thì:
 Tăng biến Top lên một đơn vị rồi gán Data ở vị
trí Top bằng x. Như vậy giá trị x đã được thêm
vào đầu danh sách.
01
02
03
04
05
06
07
08
09
10
//dung Push them phan tu x vao dau cua
stack
void Push(Stack & S, item x){
if(Isfull(S))
cout<<"nNgan xep day!"<<endl;
else{
S.Top ++;
S.Data[S.Top]=x;
}
}
2.4 Hàm lấy phần tử đầu – Pop
Stack
 Hàm này bản chất tương tự hàm Push. Bạn cần khai báo một
biến dùng để đựng giá trị của phần tử đầu stack. Sau đó giảm
giá trị của biến Top, return về biến đã lưu.
Đoạn kiểm tra ngăn xếp rỗng có làm hay không là tùy bạn nhé!
01
02
03
04
05
06
07
08
09
10
//dung Pop lay phan tu dau cua stack
item Pop(Stack & S){
if(Isempty(S)) // kt stack rong
cout<<"n Ngan xep rong! "<<endl;
else{
item x = S.Data[S.Top]; //khai báo một
biến X dùng để đựng giá trị của phần tử
đầu stack
S.Top--;
return x;
}
}
2.5 Hàm chèn vào vị trí k bất kì
trong ngăn xếp
 Chèn vào vị trí bất kì sẽ phức tạp hơn rất nhiều
hàm chèn đầu. Chính vì phải thao tác với stack
theo đúng nguyên tắc “Vào trước ra sau ” (Fisrt
In Last Out) nên mới phức tạp.
 Minh sử dụng cả hàm Push và hàm Pop trong
hàm này. Ý tưởng đưa ra là khai báo một Stack
tạm thời dùng đế lưu trữ giá trị từ vị trí k đến vị
trí Pop của danh sách cần chèn.
 Tức là bạn lấy giá trị ra khỏi ngăn xếp cho tới vị
trí cần chèn , sau đó chèn phần tử cần chèn
vào. Sau khi chèn thì lại thêm lại các phần tử
vừa lấy ra.
2.5 Hàm chèn x vào vị trí k bất kì
trong ngăn xếp
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
// chen phan tu x tai vi tri k
void Insert_k(Stack & S, item x, int k){
if(k<1 || k>S.Top) // kiem tra vi tri chen co hop
le ko
cout<<"nVi tri chen khong hop le! "<<endl;
else{
Stack Tempt; // khai bao stack tam
Init(Tempt); // khoi tao stack tam thoi
while(S.Top>=k)// chuyen phan tu s sang
stack tam thoi
{
Push(Tempt, Pop(S));
}
Push(S,x); // them phan tu x vao vi tri
k
while(Tempt.Top>0) ///lay gia tri ve S
Push(S,Pop(Tempt));
}
}
2.6 Hàm nhập phần tử – Input
 Nhập như thế nào là tùy theo từng bài
toán. Tùy theo cách bạn muốn nhập
phần tử vào ngăn xếp.
01
02
03
04
05
06
07
08
09
10
11
12
//
void Input(Stack&S){
cout<<"nNhap gia tri cho Stack nNhap 0 de
ket thuc "<<endl;
item x;
do{
cin>>x;
if(x!=0)
Push(S,x);
}
while(x!=0);
}
2.7 Hàm xuất – Output Stack
 Xuất dữ liệu ra màn hình thì thật đơn
giản. Dùng Pop đế lấy giá trị và in ra
màn hình.
1
2
3
4
5
6
//
void Output(Stack S){
while(S.Top!=0)
cout<<" "<<Pop(S);
}
Viết chương trình hoàn thiện

More Related Content

PPT
C3 stack queue
PPT
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
PDF
Bài 5 : Lập trình với CSDL trong SQL
PDF
Mang may-tinh -tai-lieu-lt - [cuuduongthancong.com]
PDF
SQL Cursor - kiểu dữ liệu Cursor (Kiểu dữ liệu con trỏ)
PDF
Giao trinh phan tich thiet ke he thong.pdf
PPTX
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
PPT
Sap xep va tim kiem
C3 stack queue
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
Bài 5 : Lập trình với CSDL trong SQL
Mang may-tinh -tai-lieu-lt - [cuuduongthancong.com]
SQL Cursor - kiểu dữ liệu Cursor (Kiểu dữ liệu con trỏ)
Giao trinh phan tich thiet ke he thong.pdf
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
Sap xep va tim kiem

What's hot (20)

PDF
Hướng Dẫn Sử Dụng Lệnh Trong ACCUMARK Pattern Design
PDF
Giáo trình quản lý dự án
PPT
chuong 3. quan he
DOC
Bai tap lap trinh c
PDF
Thiết kế csdl quản lý nhân sự
PDF
CÁC LỆNH GIÁC SƠ ĐỒ GERBER
PDF
Phụ thuộc hàm và các dạng chuẩn - dhcntt
PDF
Bài tập nhập môn lập trình
DOCX
Xây dựng hệ thống quản lý cửa hàng bán sách, đĩa nhạc, đĩa phim Media One
PDF
Quy tắc thiết kế giao diện và viết code C#
DOCX
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
PPT
Danh Sach Lien Ket
PDF
Bài tập mẫu C và C++ có giải
PPT
7 can ban assembly
PDF
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
DOC
De cuongthuchanhct221 hk2_1920_n1
DOC
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
PDF
báo cáo bài tập lớn phân tích thiết kế hệ thống quản lý khách sạn
PDF
Chuong 04 mach logic
DOC
ĐỀ CƯƠNG ÔN TẬP HỌC PHẦN: TƯ TƯỞNG HỒ CHÍ MINH
Hướng Dẫn Sử Dụng Lệnh Trong ACCUMARK Pattern Design
Giáo trình quản lý dự án
chuong 3. quan he
Bai tap lap trinh c
Thiết kế csdl quản lý nhân sự
CÁC LỆNH GIÁC SƠ ĐỒ GERBER
Phụ thuộc hàm và các dạng chuẩn - dhcntt
Bài tập nhập môn lập trình
Xây dựng hệ thống quản lý cửa hàng bán sách, đĩa nhạc, đĩa phim Media One
Quy tắc thiết kế giao diện và viết code C#
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Danh Sach Lien Ket
Bài tập mẫu C và C++ có giải
7 can ban assembly
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
De cuongthuchanhct221 hk2_1920_n1
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
báo cáo bài tập lớn phân tích thiết kế hệ thống quản lý khách sạn
Chuong 04 mach logic
ĐỀ CƯƠNG ÔN TẬP HỌC PHẦN: TƯ TƯỞNG HỒ CHÍ MINH
Ad

Similar to Bai giang stack c++ (20)

PDF
Bai10 stack queue
PDF
Cau truc dl_va_giai_thuat_bai1[1] - copy
PPT
bjjjkkjhjkhkjhjhkjgkjghfghjgklhukhuk.ppt
PDF
w8-StackQueue.pdfgfgdgfffđfđgfgdgfgdfgdgdf
PPTX
Stack &amp; queue
PDF
C6 stack queue
PDF
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
PDF
Baigiang ctdl
PPTX
CauTrucDuLieu_BaiGiang5_Stack_Queue.pptx
PDF
cau-truc-du-lieu-va-giai-thuat_pham-the-bao_slides---danh-sach.pdf
PDF
02 stack queue
PPT
Ctdl C02
PPTX
Chuong 2 - Cac cau truc du lieu co ban.pptx
PDF
CTDL-04-Ngan xep va Hang doi (1).pdf
PDF
Bai5 dsachlket
PPT
Chg2 danh sach
PDF
CHƯƠNG 3.pdf
PDF
PPT
Ctdl C04
PPTX
Giao trinh Stack va Queue trong DSA.pptx
Bai10 stack queue
Cau truc dl_va_giai_thuat_bai1[1] - copy
bjjjkkjhjkhkjhjhkjgkjghfghjgklhukhuk.ppt
w8-StackQueue.pdfgfgdgfffđfđgfgdgfgdfgdgdf
Stack &amp; queue
C6 stack queue
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
Baigiang ctdl
CauTrucDuLieu_BaiGiang5_Stack_Queue.pptx
cau-truc-du-lieu-va-giai-thuat_pham-the-bao_slides---danh-sach.pdf
02 stack queue
Ctdl C02
Chuong 2 - Cac cau truc du lieu co ban.pptx
CTDL-04-Ngan xep va Hang doi (1).pdf
Bai5 dsachlket
Chg2 danh sach
CHƯƠNG 3.pdf
Ctdl C04
Giao trinh Stack va Queue trong DSA.pptx
Ad

Recently uploaded (6)

PPTX
CÁC HẠN CHẾ CỦA MÔ HÌNH AI NỀN CÁC HẠN CHẾ CỦA MÔ HÌNH AI NỀN
PPTX
CÁC HẠN CHẾ CỦA MÔ HÌNH AI NỀN KỸ THUẬT GỢI Ý NÂNG CAO
PPTX
chuong2TTHCMupdate14tdddddddđ7n2024.pptx
PPTX
KỸ THUẬT GỢI Ý NÂNG CAO KỸ THUẬT GỢI Ý NÂNG CAO
PDF
BÁO CÁO THỰC TẬP CTY TNHH VIET NAM VICERA
PPT
Tham Khao bài giảng trí tuệ nhân tại.ppt
CÁC HẠN CHẾ CỦA MÔ HÌNH AI NỀN CÁC HẠN CHẾ CỦA MÔ HÌNH AI NỀN
CÁC HẠN CHẾ CỦA MÔ HÌNH AI NỀN KỸ THUẬT GỢI Ý NÂNG CAO
chuong2TTHCMupdate14tdddddddđ7n2024.pptx
KỸ THUẬT GỢI Ý NÂNG CAO KỸ THUẬT GỢI Ý NÂNG CAO
BÁO CÁO THỰC TẬP CTY TNHH VIET NAM VICERA
Tham Khao bài giảng trí tuệ nhân tại.ppt

Bai giang stack c++

  • 1. Ngăn xếp Stack – Cài đặt ngăn xếp bằng mảng code C/C++
  • 2. 1. Ngăn xếp – Stack là gì?  Ngăn xếp ( Stack ) trong C ++ là một cấu trúc dữ liệu tương tự như danh sách liên kết đơn, hay Queue hàng đợi. dạng danh sách liên kết đặc biệt trong đó việc thêm vào, lấy ra phần tử chỉ thực hiện ở một đầu của danh sách.
  • 3. Đặc điểm của ngăn xếp:  Tuân theo quy luật ” vào trước ra sau “ hay là ” vào sau ra trước” ( FILO – First In Last Out hoặc LIFO – Last In First OUT ) Bạn hình dung hoạt động của cấu trúc này tương tự như việc bạn xếp một chồng bát, đĩa. Cách bạn thêm vào và lấy ra chúng cho dễ hiểu.
  • 4.  Ngoài ngôn ngữ lập trình C/C++, thì tất cả các ngôn ngữ khác như Python, C#, PHP, Java, Javascript . . . đều sử dụng tới cấu trúc này!
  • 5. 1.1 Các dạng biểu diễn của ngăn xếp  Thực chất stack là một danh sách liên kết , nên bạn có thể sử dụng một trong các dạng cài đặt sau: 1. Cài đặt stack bằng danh sách liên kết 2. Biểu diễn trực tiếp ngăn xếp bằng mảng một chiều 3. Cài đặt bằng con trỏ (sử dụng các node stack)
  • 6. 1.2 Các phép toán trên ngăn xếp  Đối với cấu trúc dữ liệu stack, bạn chắc chắn sẽ phải sử dụng những phép toán sau:  Tạo ngăn xếp rỗng : Hàm Init (S )  Thêm phần tử vào đầu ngăn xếp : Hàm Push(S,x)  Lấy phần tử khỏi danh sách: Hàm Pop(S)  Kiểm tra ngăn xếp rỗng: Hàm Isempty(S)  Isfull(s) // kiem tra ds day  Chèn phần tử vào vị trí bất kì: Hàm Insert_k (S, x, k)
  • 7. 2. Ngăn xếp cài đặt bằng mảng  Bài toán: Cài đặt ngăn xếp stack các số nguyên, viết hàm chèn phần tử vào vị trí bất kỳ!
  • 8. 2.1 Khai báo cài đặt ngăn xếp  Ngăn xếp stack cài đặt bằng mảng một chiều sẽ có một biến Top dùng đế lưu vị trí hiện tại, vị trí đỉnh của ngăn xếp. Thành phần thứ 2 là mảng chứa Data dữ liệu. #i 1 2 3 4 5 6 7 8 9 include<.> //cai dat ngan xep typedef int item; // kieu cua ngan xep #define Max 100 // so pt toi da cua stack struct Stack{ int Top; item Data[Max]; }; Stack S; // kb ngan xep S
  • 9. 2.2 Nhóm hàm khởi tạo và kiểm tra  Hàm khởi tạo ngăn xếp: Chỉ cần cho giá trị của biến Top = 0 là xong. Hàm kiểm tra rỗng thì ngược lại trả về đúng nếu biến Top == 0 là được. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 // khoi tao stack void Init (Stack & S){ S.Top = 0; } //kiem tra stack rong int Isempty( Stack S){ return (S.Top==0); } // kiem tra stack day int Isfull(Stack S){ return (S.Top == Max); }
  • 10. 2.3 Thêm phần tử vào đầu stack – Hàm Push  Hàm Push dùng để thêm phần tử vào đầu ngăn xếp. Nếu ngăn xếp đã đầy thì không cho phép thêm, còn ngược lại thì:  Tăng biến Top lên một đơn vị rồi gán Data ở vị trí Top bằng x. Như vậy giá trị x đã được thêm vào đầu danh sách. 01 02 03 04 05 06 07 08 09 10 //dung Push them phan tu x vao dau cua stack void Push(Stack & S, item x){ if(Isfull(S)) cout<<"nNgan xep day!"<<endl; else{ S.Top ++; S.Data[S.Top]=x; } }
  • 11. 2.4 Hàm lấy phần tử đầu – Pop Stack  Hàm này bản chất tương tự hàm Push. Bạn cần khai báo một biến dùng để đựng giá trị của phần tử đầu stack. Sau đó giảm giá trị của biến Top, return về biến đã lưu. Đoạn kiểm tra ngăn xếp rỗng có làm hay không là tùy bạn nhé! 01 02 03 04 05 06 07 08 09 10 //dung Pop lay phan tu dau cua stack item Pop(Stack & S){ if(Isempty(S)) // kt stack rong cout<<"n Ngan xep rong! "<<endl; else{ item x = S.Data[S.Top]; //khai báo một biến X dùng để đựng giá trị của phần tử đầu stack S.Top--; return x; } }
  • 12. 2.5 Hàm chèn vào vị trí k bất kì trong ngăn xếp  Chèn vào vị trí bất kì sẽ phức tạp hơn rất nhiều hàm chèn đầu. Chính vì phải thao tác với stack theo đúng nguyên tắc “Vào trước ra sau ” (Fisrt In Last Out) nên mới phức tạp.  Minh sử dụng cả hàm Push và hàm Pop trong hàm này. Ý tưởng đưa ra là khai báo một Stack tạm thời dùng đế lưu trữ giá trị từ vị trí k đến vị trí Pop của danh sách cần chèn.  Tức là bạn lấy giá trị ra khỏi ngăn xếp cho tới vị trí cần chèn , sau đó chèn phần tử cần chèn vào. Sau khi chèn thì lại thêm lại các phần tử vừa lấy ra.
  • 13. 2.5 Hàm chèn x vào vị trí k bất kì trong ngăn xếp 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 // chen phan tu x tai vi tri k void Insert_k(Stack & S, item x, int k){ if(k<1 || k>S.Top) // kiem tra vi tri chen co hop le ko cout<<"nVi tri chen khong hop le! "<<endl; else{ Stack Tempt; // khai bao stack tam Init(Tempt); // khoi tao stack tam thoi while(S.Top>=k)// chuyen phan tu s sang stack tam thoi { Push(Tempt, Pop(S)); } Push(S,x); // them phan tu x vao vi tri k while(Tempt.Top>0) ///lay gia tri ve S Push(S,Pop(Tempt)); } }
  • 14. 2.6 Hàm nhập phần tử – Input  Nhập như thế nào là tùy theo từng bài toán. Tùy theo cách bạn muốn nhập phần tử vào ngăn xếp. 01 02 03 04 05 06 07 08 09 10 11 12 // void Input(Stack&S){ cout<<"nNhap gia tri cho Stack nNhap 0 de ket thuc "<<endl; item x; do{ cin>>x; if(x!=0) Push(S,x); } while(x!=0); }
  • 15. 2.7 Hàm xuất – Output Stack  Xuất dữ liệu ra màn hình thì thật đơn giản. Dùng Pop đế lấy giá trị và in ra màn hình. 1 2 3 4 5 6 // void Output(Stack S){ while(S.Top!=0) cout<<" "<<Pop(S); }
  • 16. Viết chương trình hoàn thiện