Ðể biểu diễn Stack: Dùng mảng 1 chiều hoặc danh sách liên kết.. Mảng 1 chiều Danh sách liên kết ñơn - Viết chương trình dễ dàng, nhanh chóng - Bị hạn chế do số lượng phần tử cố ñịnh - T
Trang 1Ðể biểu diễn Stack: Dùng mảng 1 chiều hoặc danh sách liên kết.
Mảng 1 chiều Danh sách liên kết ñơn
- Viết chương trình dễ dàng,
nhanh chóng
- Bị hạn chế do số lượng phần tử
cố ñịnh
- Tốn chi phí tái cấp phát và sao
chép vùng nhớ nếu sử dụng
mảng ñộng
Phức tạp khi triển khai chương trình
Không bị cố ñịnh về số phần tử, phụ thuộc vào bộ nhớ
This is trial version www.adultpdf.com
Trang 2// Giả sử Stack chứa các phần tử kiểu nguyên // Khai báo cấu trúc Stack
typedef struct STACK {
int* StkArray; // mảng chứa các phần tử int StkMax; // số phần tử tối ña
int StkTop; // vị trí ñỉnh Stack };
//Thao tác “Khởi tạo Stack rỗng”
int InitStack(STACK& s, int MaxItems) {
s.StkArray = new int[MaxItems];
if (s.StkArray == NULL)
return 0; // Không cấp phát ñược bộ nhớ
s.StkMax = MaxItems;
s.StkTop = -1; // chưa có phần tử nào trong Stack return 1; // khởi tạo thành công
}
Ngăn xếp sử dụng mảng
This is trial version www.adultpdf.com
Trang 3//Thao tác “Kiểm tra Stack rỗng”
int IsEmpty(const STACK &s) {
if (s.StkTop==-1)
return 1; // Stack rỗng return 0; // Stack không rỗng
}
//Thao tác “Kiểm tra Stack ñầy”
int IsFull(const STACK &s) {
if (s.StkTop==s.StkMax-1)
return 1; // Stack ñầy return 0; // Stack chưa ñầy
}
This is trial version www.adultpdf.com
Trang 4//Thao tác “Push”: thêm một phần tử vào ñỉnh Stack
int Push (STACK& s, int newitem) {
if (IsFull(s))
return 0; // stack ñầy, không thể thêm
s.StkTop++;
s.StkArray[s.StkTop] = newitem;
return 1; // thêm thành công
}
//Thao tác “Pop”: lấy ra 1 phần tử từ ñỉnh Stack
int Pop(STACK& s, int& outitem) {
if (IsEmpty(s))
return 0; // Stack rỗng, không lấy ra ñược
outitem = s.StkArray[s.StkTop];
s.StkTop ;
return 1; // lấy ra thành công
}
This is trial version www.adultpdf.com
Trang 5//truy xuất 1 phần tử ở ñỉnh Stack, không làm thay ñổi Stack
int StackTop(const STACK s, int& outitem) {
if (IsEmpty(s))
return 0; // Stack rỗng, không lấy ra ñược
outitem = s.StkArray[s.StkTop];
return 1; // lấy ra thành công
}
This is trial version www.adultpdf.com
Trang 6// Giả sử Stack chứa các phần tử kiểu nguyên
// Khai báo cấu trúc một phần tử trong stack
typedef struct tagSTACK_NODE {
int Data;
tagSTACK_NODE *pNext;
} STACK_NODE;
// Khai báo cấu trúc stack
typedef struct STACK {
int StkCount;
STACK_NODE *StkTop;
};
Ngăn xếp sử dụng DSLK
This is trial version www.adultpdf.com
Trang 7//Thao tác “Khởi tạo stack rỗng”:
void InitStack(STACK& s) {
s.StkTop = NULL;
s.StkCount = 0;
}
//Thao tác “Kiểm tra stack rỗng”
int IsEmpty(const STACK& s) {
if (s.StkTop == NULL) return 1; // stack rỗng
return 0; // stack không rỗng
}
This is trial version www.adultpdf.com
Trang 8//Thao tác “Kiểm tra stack ñầy”
int IsFull (const STACK s) {
// thử tạo mới một phần tử
STACK_NODE* temp = new STACK_NODE;
// nếu không tạo ñược stack ñầy
if (temp == NULL)
return 1; // stack ñầy
delete temp;
return 0; // stack chưa ñầy
}
This is trial version www.adultpdf.com
Trang 9//Thao tác “Push”: thêm 1 phần tử vào ñỉnh stack
int Push(STACK &s, int newitem) {
if (IsFull(s))
return 0; // Stack ñầy, không thêm vào ñược
STACK_NODE *pNew = new STACK_NODE;
pNew->Data = newitem;
pNew->pNext = s.StkTop;
s.StkTop = pNew;
s.StkCount++;
return 1; // Thêm thành công
}
This is trial version www.adultpdf.com
Trang 10//Thao tác “Pop”: lấy ra 1 phần tử từ ñỉnh stack
int Pop(STACK &s, int& outitem) {
if (IsEmpty(s))
return 0; // Stack rỗng, không lấy ra ñược // lưu lại con trỏ ñến ptử ñầu
STACK_NODE *temp = s.StkTop;
outitem = s.StkTop->Data;
s.StkTop = s.StkTop->pNext;
delete temp;
s.StkCount ;
return 1; // Lấy ra thành công
}
This is trial version www.adultpdf.com