Chuy ển đổi từ hệ thập phân sang hệ nhị phân.. Chuy ển đổi từ hệ nhị phân sang hệ thập phân.. Chuy ển đổi từ hệ thập phân sang hệ 16.. Chuy ển đổi từ hệ 16 sang hệ thập phân... Chuy ển
Trang 1Gi ảng viên: TS Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580
C ấu trúc dữ liệu và giải thuật
Trang 2Bài 10 M ột vài ứng dụng của Stack
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
Trang 310.1 Đảo mảng (1/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 410.1 Đảo mảng (2/3)
Ý t ưởng thực hiện giải thuật:
1 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 610.2 Đảo chuỗi (1/4)
Cho m ột chuỗi gồm nhiều từ.
Đả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 7Push 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 8void push(char* stack[], char* value, int* top);
char* pop(char* stack[], int* 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 1010.3 Chuy ển đổi hệ số (1/9)
Các h ệ số hay sử dụng: hệ thập phân (Decimal), hệ
nh ị 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
Trang 1110.3 Chuy ển đổi hệ số (2/9)
Vi ệc chuyển đổi giữa các hệ số thường xét:
1 Chuy ển đổi từ hệ thập phân sang hệ nhị phân.
2 Chuy ển đổi từ hệ nhị phân sang hệ thập phân.
3 Chuy ển đổi từ hệ thập phân sang hệ 16.
4 Chuy ển đổi từ hệ 16 sang hệ thập phân.
Trang 1210.3 Chuy ển đổi hệ số (3/9)
Kh ởi tạo một Stack rỗng.
Chuy ển đổi số từ dạng thập phân sang nhị phân bằng
phép div và mod cho 2.
K ết quả của phép mod được đưa vào Stack.
Đọc từ Stack cho đến hết, kết quả được nối với nhau để
t ạo thành chuỗi.
K ết thúc giải thuật.
Trang 1410.3 Chuy ển đổi hệ số (3/9)
d ụng Stack:
Kh ởi tạo một Stack rỗng.
Chuy ển đổi số từ dạng thập phân sang nhị phân bằng
phép div và mod cho 16.
K ết quả của phép mod được đưa vào Stack.
Đọc từ Stack cho đến hết, kết quả được nối với nhau để
t ạo thành chuỗi.
K ết thúc giải thuật.
Trang 15}mString[i]='\0';
returnmString;
}
Trang 16• m ột đoạn biểu thức nằm giữa một cặp dấu ngoặc trái,
ph ải được gọi là sử dụng đúng dấu ngoặc.
Trang 1810.4 Bracket Matching (3/6)
Gi ải thuật kiểm tra sử dụng dấu ngoặc:
1 T ạo một bStack rỗng (Stack chứa dấu ngoặc).
2 V ới mỗi ký hiệu sym trong đoạn (từ trái sang phải) :
2.1 N ếu sym là dấu ngoặc trái:
2.1.1 Đưa sym vào bStack
2.2 N ếu sym là dấu ngoặc phải:
2.2.1 N ếu bStack rỗng, return false.
2.2.2 L ấy dấu ngoặc ở bStack, đưa vào biến left.
2.2.3 N ếu left và sym không khớp được với nhau,
return false.
3 D ừng giải thuật, trả về True nếu bStack rỗng, hoặc
False v ới các trường hợp khác.
Trang 19void push(charbStack[], char value,int *top);
charpop(charbStack[], int *top);
int isEmpty(char bStack[],inttop);
int isFull(charbStack[], int top);
void makeEmpty(intbStack[],int* top);
intbracketMatching(char* a,char bStack[], int *top);
Trang 20kt=0;
elsecharch=pop(bStack,top);
}}
Trang 22 Như vậy, trong giải thuật trên, cần lưu ý thêm quá
trình push và pop vào bStack:
N ếu quá trình push vào bStack có dạng: (, [, {.
Quá trình pop t ừ bStack cần đúng thứ tự: }, ], ).
N ếu đã duyệt xong biểu thức và bStack rỗng → return True, ngược lại, return False.
Trang 23for(int i=0;i<strlen(a);i++) {
if(a[i]=='(' || a[i]=='[' || a[i] == '{')push(bStack,a[i],top);
if(a[i]==')' || a[i]=='}' || a[i]==']'){
if(isEmpty(bStack,*top))kt=0;
else {
charch=pop(bStack,top);
if(!matching(ch,a[i])) kt=0; }}
}
if(!isEmpty(bStack,*top)) kt=0;