You are on page 1of 13

2.2.

Stack
2.2.1. Stack
a. Stack (ngăn xếp) là một kiểu cấu trúc dữ liệu đặc
biệt trong đó việc bổ sung hay loại bỏ 1 phần tử chỉ được
thực hiện ở đầu của ngăn xếp được gọi là đỉnh, nên ngăn
xếp gọi là danh sách không đầy đủ, và thực hiện theo cơ
chế LIFO(LAST IN FIRST OUT) - đối tượng nào vào sau
thì sẽ ra trước

b. Lưu trữ stack: có hai cách: Dùng mảng, và DSLK


2.2. Stack
c. Các thao tác cơ bản trên stack
IsEmpty: kiểm tra xem stack có rỗng hay không
Push: thêm 1 đối tượng vào đầu stack <=> theo
cơ chế LIFO
Pop: lấy phần tử đầu stack và trả về giá trị của đối
tượng đầu stack đồng thời phải hủy nó trong stack đi
Top: xem thông tin của phần tử đầu stack và
không hủy nó đi
Ví dụ Stack
Ứng dụng Stack
* Chuyển đổi cơ số: nhị phận, thập bát phân
* Tính biểu thức số học với ký pháp BA Lan
VÍ DỤ: nhập danh sách stack chứa các số nguyên, sau
đó in ra màn hình các số nguyên đó
Vì cài đặt theo danh sách liên kết nên sẽ phải:
- Khai báo cấu trúc 1 node
- Khai báo cấu trúc 1 stack
- Khởi tạo 1 node
- Khởi tạo 1 stack
Khai báo cấu trúc stack
1. Khai báo cấu trúc 1 node của stack
typedef struct
{ int Data;
struct Node *Next;
}Node;
2. Khai báo cấu trúc stack
Typedef struct
{
Node * top;//dung con trỏ đầu để quản lý stack
} Stack;
3. Khởi tạo 1 stack rỗng
void KhoiTaoStack (Stack *s)
{ s.top = NULL }
4. Khởi tạo 1 Node
Node *KhoiTaoNode (int *x)
{
Node *P =(Node *)malloc(sizeof(Node));
P->next = NULL;
P->data = *x;
return P;
}
Kiểm tra Stack rỗng
bool IsEmpty(Stack *s)
{
    if(s->top==NULL) return true;
Else return False;
}
Thêm phần tử vào Stack
Thêm phần tử vào Stack
void Push (Stack *s, Node *p)
{
if(s->top==NULL)
s->top =p;
else
{
p->next =s->top ;
s->top =p
}
}
Lấy phần tử đầu Stack và hủy
int Pop(Stack *s)
{
if(IsEmpty(s)==false)
{
Node *p=s->top ;
int x=p->data ; Tương tự
s->top =s->top ->next; xóa đầu
dslk đơn
delete p;
return x;
}
}
Chuyển đổi cơ số
Chuyển đổi cơ số 10 sang hệ nhị phân

Kết quả: 1 1 1 1 0
Chuyển đổi cơ số
Chuyển đổi cơ số 10 sang cơ số 2
B1: Nhập số cần đổi n
B2: chừng nào mà n khác 0 thì:
- r là số dư của phép chia n cho 2
- Đẩy r vào stack
- n = n/2
B3: Xuất stack để được kết quả.
Chuyển đổi cơ số
Void chuyendoi(int n)
{ // Đẩy phần dư vào stack
while (n!=0)
{
int r =n%2; // lấy số dư
Node *p = KhoiTaoNode(&r);
Push(s,p);// đẩy node p vào stack
n=n/2;
}
while (isEmty(s)==false)// không rỗng
{ int x = Pop(s);
printf(“%3d”,x) }
}

You might also like