ĐỀ CƯƠNG CẤU TRÚC DỮ LIỆU
I.
STACK, QUEUE
a. STACK (FILO)
• Khai báo
#define MaxLength 100
//độ dài của mảng
typedef int ElementType;
//kiểu phần tử của ngăn xếp
typedef struct
{
ElementType Elements[MaxLength]; //Lưu nội dung của các phần tử
int Top_idx;
//giữ vị trí đỉnh ngăn xếp
}Stack;
Stack S;
• Tạo STACK rỗng
void MakeNull_Stack(Stack *S)
{
S->Top_idx=MaxLength;
}
• Kiểm tra rỗng – trang 34
• Kiểm tra đầy – trang 33
• Lấy đỉnh
ElementType Top(Stack S)
{
if (S->Top == MaxLength)
{
printf("Loi! Ngan xep rong");
}
else
{
return S.Elements[S.Top_idx];
}
}
• Thêm vào STACK – Push (phải có *S)
void Push(ElementType X, Stack *S)
{
if (S->Top_idx ==0) // ngan xep day
printf("Loi! Ngan xep day!");
else
{
S->Top_idx=S->Top_idx-1;
S->Elements[S->Top_idx]=X;
}
}
• Xóa khỏi STACK – POP (phải có *S)
void Pop(Stack *S)
{
if (S->Top == MaxLength) // STACK rong
{
printf("Loi! Ngan xep rong!");
}
else
{
S->Top_idx = S->Top_idx+1;
}
}
• BÀI TẬP áp dụng
Chuyển đổi cơ số thập phân sang nhị phân
void chuyencoso( int X, Stack *S)
{
MakeNull_Stack(S);
while (X!=0)
{
int soDu = X%2;
Push(soDu, S);
X = X/2;
}
// xuất Stack ra
while((S)->Top!=Max)
{
cout<
}
}
Kiểm tra dấu ngoặc
Sinh viên tự viết
b. QUEUE (FIFO)
• Hàng đợi tịnh tiến
Khai báo
#define MaxLength 100
//chiều dài tối đa của mảng
typedef int ElementType;
//Kiểu dữ liệu của các phần tử trong hàng
typedef struct
{
ElementType Elements[MaxLength];
//Lưu trữ nội dung các phần tử
int Front
int Rear;
//Chỉ số đầu và cuối hàng
} Queue;
Queue Q;
TẠO RỖNG
void MakeNull_Queue(Queue *Q)
{
Q->Front=-1;
Q->Rear=-1;
}
KIỂM TRA RỖNG – TRANG 37,38
KIỂM TRA ĐẦY – TRANG 37,38
Chèn – ENQUEUE (3 phần quan trọng)
void EnQueue(ElementType X,Queue *Q)
{
if (!Full_Queue(*Q))
{
if (Empty_Queue(*Q))
Q->Front=0;
if (Q->Rear==MaxLength-1)
{
//Di chuyen tinh tien ra truoc Front -1 vi tri
for(int i=Q->Front ; i<=Q->Rear ; i++)
{
Q->Elements[i-Q->Front]=Q->Elements[i];
}
//Cập nhật lại vi tri Rear moi
Q->Rear=MaxLength - Q->Front-1;
Q->Front=0;
}
//Tang Rear de luu noi dung moi – quan trọng
Q->Rear=Q->Rear+1;
Q->Element[Q->Rear]=X;
}
}
else printf("Loi: Hang day!");}
Xóa – DEQUEUE
void DeQueue(Queue *Q)
{
if (!Empty_Queue(*Q))
{
Q->Front=Q->Front+1; //quan trọng
if (Q->Front>Q->Rear)
{
MakeNull_Queue(Q); //Dat lai hang rong
}
}else printf("Loi: Hang rong!");
}
• Hàng đợi vòng
Khác với tĩnh %MaxLength
KIỂM TRA ĐẦY
int Full_Queue(Queue Q)
{
return (Q.Rear-Q.Front+1) % MaxLength==0;
}
XÓA PHẦN TỬ
void DeQueue(Queue *Q)
{
if (!Empty_Queue(*Q))
{
//Nếu hàng chỉ chứa một phần tử thì khởi tạo hàng lại
if (Q->Front==Q->Rear) MakeNull_Queue(Q);
{
else Q->Front=(Q->Front+1) % MaxLength;
//tăng Front lên 1 đơn vị
}
}else printf("Loi: Hang rong!");
}
KIỂM TRA ĐẦY
void EnQueue(ElementType X,Queue *Q){
if (!Full_Queue(*Q))
{
if (Empty_Queue(*Q))
{
Q->Front=0;
}
Q->Rear=(Q->Rear+1) % MaxLength; //QUAN TRỌNG
Q->Elements[Q->Rear]=X;
//QUAN TRỌNG
}
else printf("Loi: Hang day!");
}
• BÀI TẬP ÁP DỤNG
Mô tả bài chuyến phà - đúng nguyên tắt vào trước ra trước.