Kyle Loudon Mastering Algorithms, Chapter 6 Stacks and Queues.. Bài gi ảng TS Nguyễn Nam Hồng.3[r]
Trang 1Gi ảng viên: TS Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com
Bài 10: Ứng dụng của ngăn xếp
Trang 210.1 Đảo mảng (3)
10.2 Đảo chuỗi (4)
10.3 Chuy ển đổi hệ số (9)
10.4 Bracket Matching (5)
10.5 Balancing Act (4)
1 Data structures and Algorithms Stacks.htm
2 Kyle Loudon Mastering Algorithms, Chapter 6 Stacks and Queues
3 Elliz Horowitz – Fundamentals of Data Structures, Chapter 3 Stacks and
Queues
4 Deshpande Kakle – C and Data Structures, Chapter 19 Stacks and
Queues
5 Bài gi ảng TS Nguyễn Nam Hồng
Trang 3 Cho một mảng gồm một dãy các giá trị.
Để đảo thứ tự các phần tử trong mảng, sử dụng nguyên lý Last-In-First-Out của Stack
Ví dụ về hoạt động của đảo mảng:
17 23 25 18
18
25 23 17
134 47 55 216
216
55 47 134
Trang 41. Khởi tạo một Stack rỗng, có kiểu số.
2. Với n phần tử của mảng, lần lượt đưa vào Stack
thông qua hàm Push:
Push a[i] in to Stack.
3. Lần lượt lấy ra từ Stack n phần tử và đưa vào trở
lại mảng ban đầu:
Pop a item from nStack in to a[i].
4. Kết thúc giải thuật
Trang 5Ví d ụ về đảo mảng:
void revArray( int a[], int n, int stack[])
{
makeEmpty(stack);
for ( int i=0;i<n;i++)
push(stack,a[i]);
for ( int i=0;i<n;i++)
a[i]=pop(stack);
}
Trang 6 Đảo chuỗi thực hiện việc đảo các từ trong chuỗi, sử
dụng ý tưởng Last-In-First-Out của Stack
Ví dụ về đảo chuỗi:
Tôi Làm Bài
T ập
T ập Bài Làm Tôi
Chăm
H ọc Thì
Gi ỏi
Gi ỏi Thì
H ọc Chăm
Trang 7Ý t ưởng xây dựng chương trình:
1. Tạo một wStack rỗng.
2. Với mỗi từ mWord đọc được từ string, đưa từ đó
vào Stack:
Push mWord into wStack.
3. Đọc từ wStack cho đến hết, thực hiện:
Pop a word from wStack into mWord.
Concate mWord to the end of outp string.
4. Dừng giải thuật
Chú ý: cần xây dựng hàm tách word từ string
Trang 8#include <conio.h>
#include "string.h"
#define MAXSIZE 100
#define MAX 100
void push( char * stack[], char * value, int * top);
char * pop( char * stack[], int * top);
void main() {
char * stack[MAXSIZE];
int top=-1;
char mString[MAX];
char * mWord;
printf("Nhap vao mot chuoi: ");
gets(mString);
mWord = strtok(mString," ");
push(stack,mWord,&top);
mWord = strtok(NULL," ");
if(mWord) push(stack,mWord,&top); }
char *p=pop(stack,&top);
while (top>=0) {
p=strcat(p," ");
p=strcat(p,pop(stack,&top));
} printf("Chuoi ket qua \n");
puts(p);
getch();
}
Trang 9void push( char * stack[], char * value, int * top)
{
if (*top < MAXSIZE)
{
*top=*top+1;
stack[*top]=(char*)malloc(strlen(value));
strcpy(stack[*top],value);
}
else
{
printf("Khong the them vao STACK\n");
getch();
}
}
char * pop( char * stack[], int * top) {
char * value;
if (*top>=0) {
value=(char*)malloc(strlen(stack[*top])); strcpy(value,stack[*top]);
*top=*top-1;
}
else
{ printf("STACK rong\n");
value = NULL; }
return value;
}
void makeEmpty( int * top) {
*top=-1;
}
Trang 10nhị phân (Binary), hệ 16 (Hexadecimal).
Con người thường sử dụng hệ thập phân
Đối với máy tính, thường sử dụng hệ nhị phân
Hệ 16 là hệ trung gian giữa hệ thập phân và hệ nhị phân
Ví dụ: 111 = (01101111)B = (6F)H