Computer_Dark_Angle
10-07-2009, 08:43 PM
Đây là bài toán ứng dụng stack giải một số bài toán cơ bản và được code trên c++
*-* Chuyển Đổi Cơ Số Ở Dạng Thập Phân sang Các Dạng :
• Nhị Phân
• Bát Phân
• Thập Lục Phân
*-* Kiểm Tra Dấu Ngoặc Của Một Biểu Thức Toán Được Nhập Vào Đ ? S
*-* Đảo Chuỗi Được Nhập Vào (Không phân biệt số hay chữ).
*-* Tính Biểu Thức Toán Dạng Hậu Tố.
mă nguồn như sau:
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#define MaxLength 200
#define True 1
#define False 0
typedef int ElementType;
typedef int Position;
//Khai Bao Cau Truc Stack
typedef struct Stack {
ElementType Element [MaxLength];
Position Top;
Position Next;
}stack;
//Cac ham Tren Stack
Position Empty_Stack (stack ); //Kiem Tra Stack Rong
Position Full_Stack (stack ); //Kiem Tra Stack Day
void MakeNull_Stack (stack *); //Khoi Tao Stack Rong
Position top (stack ); //Tra Ve Vi Tri Dinh
Position Next_Top (stack *); //Tang Bien Top
void Push (stack *,ElementType ); //Ham Push Stack
Position Pop (stack ); //Ham Pop Stack
// Cac Ham Thao Tac
void Luu_Y(); //Luu Y Cua Chuong Trinh
void Menu (); //Menu Lua Chon Cac Thao Tac
void Nhi_Phan (stack *,int ); //Ham Doi So Sang Nhi Phan
void Thap_Luc (stack *,int ); //Ham Doi So Sang So Thap luc Phan
void Bat_Phan (stack *,int ); //Ham Doi So Sang Bat Phan
int KT_BieuThuc (stack *,stack *,char* ); //Ham Kiem Tra Bieu Thuc Toan Hoc
void DaoChuoi (stack *); //Dao Chuoi So
int BT_HauTo (char *); //Kiem Tra 1 Bieu Thuc Co Phai La Bieu Thuc Hau To ?
void HauTo (stack *,char *); //Tinh Bieu Thuc Toan Dang Hau To
int main (void){
clrscr ();
stack S,S2;
MakeNull_Stack (&S);
MakeNull_Stack (&S2);
int Choice; // Lua Chon
char Ans;
Luu_Y ();
do {
printf ("\n\n\tNHAN ENTER DE TIEP TUC ! ");
getch ();
clrscr ();
Menu ();
printf ("\tBan Chon Thao Tac Nao : ");
scanf ("%d",&Choice);
int Count = 1; //Dung De Dem So Lan Nhap Sai Yeu Cau Va Chuong Trinh
//Se Tu Dong Dung Neu Qua Gioi Hang Nhap Yeu Cau.
while (Choice < 1 || Choice > 7){ //Neu Nhap Sai.
Count += 1;
printf ("\t------Lua Chon Cua Ban Khong Dung Hoac Chua Co Trong Menu !-----");
printf ("\n\tVui Long Nhap Lai Lua Chon : ");
scanf ("%d",&Choice);
//Kiem Tra Nhap Yeu Cau
if (Count == 3){
printf ("\n\t------Ban Khong Muon Su Dung Chuong Trinh !------ ");
printf ("\n\t------Ban Da Nhap Sai 3 Lan ------");
printf ("\n\t------Chuong Trinh Tu Dong !------");
getch ();
exit (1);
}
}
switch (Choice){
case 1 : //Doi So Thap Phan Sang Nhi Phan.
int So;
printf ("\tNhap Vao So Can Chuyen : ");
scanf ("%d",&So);
Nhi_Phan (&S,So);
break;
case 2 : //Doi So Thap Phan Sang Thap Luc Phan.
printf ("\tNhap Vao So Can Chuyen : ");
scanf ("%d",&So);
Thap_Luc (&S,So);
break;
case 3 : //Doi So Thap Phan Sang Bat Phan.
printf ("\tNhap Vao So Can Chuyen : ");
scanf ("%d",&So);
Bat_Phan (&S,So);
break;
case 4 : //Kiem Tra 1 Bieu Thuc Toan.
char *BT = (char*) malloc (sizeof (char));
printf ("\n\tNhap Vao Bieu Thuc Toan : ");
cin >> BT;
if (KT_BieuThuc(&S,&S2,BT))
printf ("\tBieu Thuc Dung !");
else printf ("\tBieu Thuc Sai !");
break;
case 5 : //Dao Nguoc 1 Chuoi Ky Tu.
DaoChuoi (&S);
break;
case 6 : //Tinh Gia Tri 1 Bieu Thuc Toan Dang Hau To.
cout <<"\n\t--Chuong Trinh Con Han Che La Chi Tinh Duoc Bieu Thuc ";
cout <<"\n\tChua So Hang Tu 0 den 9\n";
cout <<"\n\t--Vui Long Nhap Ko Khoang Trang Va Nhap Bieu Thuc Dung Dang Hau To\n";
cout <<"\n\t--NHAN ENTER DE TIEN HANH NHAP BIEU THUC !"<<endl; getch ();
char *BT2;
cout << "\tPlease input : ";
cin >>BT2;
while (!BT_HauTo(BT2)){
cout <<"\n\tBieu Thuc Khong Phai Dang Hau To !\n";
cout <<"\tVui Long Kiem Tra Va Nhap Lai Bieu Thuc !\n";
cout <<"\tBieu Thuc : ";
cin >> BT2;
}
HauTo (&S,BT2);
break;
case 7 : // Thoat.
printf ("\n\tBan Co Chac La Muon Thoat Khong ?\n\tThoat (Y)/ Khong Thoat (N) ");
cin >>Ans;
while (Ans != 'Y' && Ans != 'y' && Ans != 'n' && Ans != 'N'){
cout << "\tBan Dong Y (Y) hay Khong (N) : ";
cin >> Ans;
}
if (Ans == 'n' || Ans == 'N')
break;
else exit (1);
}
}while (Choice != 7 || Ans == 'n' || Ans == 'N');
getch ();
return 0;
}
void Luu_Y (){ //Dua o Dau Chuong Trinh
textcolor (WHITE);
clrscr();
printf ("\n\t\t--------DH8TH2--------\n");
printf ("\n\tDo An 6 : Ung Dung Stack _ Cai Dat Bang Mang. \n");
printf ("\n\n Chuong Trinh Duoc Viet Boi : \n ");
printf ("\t1.Tran Van Tuan - DTH072273 \n");
printf ("\t2.Bui Duc Hanh - DTH072239 \n");
printf ("\t3.Truong Van Nam - DTH072250.\n");
printf ("\n\tChu Y : ");
printf ("\n\tKhong Nhap Cac Yeu Cau Ngoai Pham Vi Lua Chon Cua Chuong Trinh !");
printf ("\n\tNen Nhap Dung Theo Tung Chi Dan.");
}
void Menu (){ //Menu Lua Chon
textcolor (YELLOW);
clrscr ();
printf ("\n\t*---------------************************----------------------*\n");
printf ("\t| |\n");
printf ("\t| CHUONG TRINH UNG DUNG STACK DE GIAI CAC BAI TOAN CO BAN |\n");
printf ("\t| |\n");
printf ("\t| ----- * ----- |\n");
printf ("\t| Cac Lua Chon : |\n");
printf ("\t| |\n");
printf ("\t| 1.Dung Stack Doi So Thap Phan Sang Nhi Phan. |\n");
printf ("\t| 2.Dung Stack Doi So Thap Phan Sang Thap Luc Phan. |\n");
printf ("\t| 3.Dung Stack Doi So Thap Phan Sang Bat Phan. |\n");
printf ("\t| 4.Kiem Tra Mot Bieu Thuc Toan Hoc Dung Hay Sai. |\n");
printf ("\t| 5.Dao Nguoc Mot Chuoi Ky Tu Duoc Nhap Vao. |\n");
printf ("\t| 6.Tinh Gia Tri Mot Bieu Thuc Toan Hoc Dang Hau To. |\n");
printf ("\t| 7.Thoat Khoi Ung Dung |\n");
printf ("\t| |\n");
printf ("\t*-----****************-----------------*****************------*\n");
}
Position Empty_Stack (stack S){
return (S.Top == MaxLength ? True : False);
}
Position Full_Stack (stack S){
return (S.Top == 0 ? True : False);
}
void MakeNull_Stack (stack *S){
S -> Top = MaxLength;
}
Position top (stack S){
return S.Top;
}
Position Next_Top (stack *S){
return S -> Top++;
}
void Push (stack *S,ElementType X){
if (Full_Stack (*S))
printf ("Stack is Full !");
else {
S -> Top = S -> Top - 1;
S -> Element [S -> Top] = X;
}
}
Position Pop (stack S){
if (Empty_Stack (S)){
printf ("\tSorry ! Stack is Empty !");
return 0;
}
else
return S.Element[S.Top];
}
void Nhi_Phan (stack *S,int So){
MakeNull_Stack (S);
int Temp = So;
int SoDu;
if (So <= 0){
printf ("\n\tCo So Ban Nhap Sai, Vui Long Kiem Tra Lai !");
}
else{
while (So != 0) {
SoDu = So % 2;
Push (S,SoDu);
So = So / 2;
}
printf ("\t---So %d Dang Nhi Phan La : ",Temp);
while (!Empty_Stack (*S)){
printf ("%3x",Pop (*S));
Next_Top (S);
}
}
}
void Thap_Luc (stack *S,int So){
MakeNull_Stack (S);
int Temp = So;
int SoDu;
if (So <= 0){
printf ("\n\tCo So Ban Nhap Sai, Vui Long Kiem Tra Lai !");
}
else{
while (So != 0){
SoDu = So % 16;
Push (S,SoDu);
So = So / 16;
}
printf ("\t---So %d Dang Thap Luc La : ",Temp);
while (!Empty_Stack (*S)){
printf ("%3X",Pop (*S));
Next_Top (S);
}
printf (" (H)");
}
}
void Bat_Phan (stack *S,int So){
MakeNull_Stack (S);
int Temp = So;
int SoDu;
if (So <= 0){
printf ("\n\tCo So Ban Nhap Sai, Vui Long Kiem Tra Lai !");
}
else{
while (So != 0){
SoDu = So % 8;
Push (S,SoDu);
So = So / 8;
}
printf ("\t---So %d Dang Bat Phan La : ",Temp);
while (!Empty_Stack (*S)){
printf ("%3x",Pop (*S));
Next_Top (S);
}
}
}
int KT_BieuThuc (stack *S,stack *S2, char *BT){
MakeNull_Stack (S);
for (int i = 0; i <= strlen (BT);i++){
if (BT [i] == '(')
Push (S,1);
if (BT [i] == ')')
Push (S2,1);
}
return (top (*S) == top (*S2) ? True : False);
}
void DaoChuoi (stack *S){
MakeNull_Stack (S);
char Chuoi [200];
int Vitri = 0;
printf ("\n\tNhap Vao Chuoi So (0 De ket Thuc) : ");
while ((Chuoi [Vitri++] = getchar ()) != '0');
Chuoi [--Vitri] = '\0';
for (int i = 0;i < Vitri ;i++){
Push (S,Chuoi[i]);
}
printf ("\n\tChuoi Dao La : ");
while (!Empty_Stack (*S)){
printf ("%c",Pop (*S));
Next_Top (S);
}
}
int GanSo (char So){
int Temp;
switch (So){
case '0' : Temp = 0; break;
case '1' : Temp = 1; break;
case '2' : Temp = 2; break;
case '3' : Temp = 3; break;
case '4' : Temp = 4; break;
case '5' : Temp = 5; break;
case '6' : Temp = 6; break;
case '7' : Temp = 7; break;
case '8' : Temp = 8; break;
case '9' : Temp = 9; break;
}
return Temp;
}
int Tinh (char BT,int So1,int So2){
int KQ;
switch (BT){
case '+' : KQ = So1 + So2; break;
case '-' : KQ = So1 - So2; break;
case '*' : KQ = So1 * So2; break;
case '/' : KQ = So1 / So2; break;
case '$' : KQ = pow(So1,So2); break;
}
return KQ;
}
>>c̣n tiếp
*-* Chuyển Đổi Cơ Số Ở Dạng Thập Phân sang Các Dạng :
• Nhị Phân
• Bát Phân
• Thập Lục Phân
*-* Kiểm Tra Dấu Ngoặc Của Một Biểu Thức Toán Được Nhập Vào Đ ? S
*-* Đảo Chuỗi Được Nhập Vào (Không phân biệt số hay chữ).
*-* Tính Biểu Thức Toán Dạng Hậu Tố.
mă nguồn như sau:
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#define MaxLength 200
#define True 1
#define False 0
typedef int ElementType;
typedef int Position;
//Khai Bao Cau Truc Stack
typedef struct Stack {
ElementType Element [MaxLength];
Position Top;
Position Next;
}stack;
//Cac ham Tren Stack
Position Empty_Stack (stack ); //Kiem Tra Stack Rong
Position Full_Stack (stack ); //Kiem Tra Stack Day
void MakeNull_Stack (stack *); //Khoi Tao Stack Rong
Position top (stack ); //Tra Ve Vi Tri Dinh
Position Next_Top (stack *); //Tang Bien Top
void Push (stack *,ElementType ); //Ham Push Stack
Position Pop (stack ); //Ham Pop Stack
// Cac Ham Thao Tac
void Luu_Y(); //Luu Y Cua Chuong Trinh
void Menu (); //Menu Lua Chon Cac Thao Tac
void Nhi_Phan (stack *,int ); //Ham Doi So Sang Nhi Phan
void Thap_Luc (stack *,int ); //Ham Doi So Sang So Thap luc Phan
void Bat_Phan (stack *,int ); //Ham Doi So Sang Bat Phan
int KT_BieuThuc (stack *,stack *,char* ); //Ham Kiem Tra Bieu Thuc Toan Hoc
void DaoChuoi (stack *); //Dao Chuoi So
int BT_HauTo (char *); //Kiem Tra 1 Bieu Thuc Co Phai La Bieu Thuc Hau To ?
void HauTo (stack *,char *); //Tinh Bieu Thuc Toan Dang Hau To
int main (void){
clrscr ();
stack S,S2;
MakeNull_Stack (&S);
MakeNull_Stack (&S2);
int Choice; // Lua Chon
char Ans;
Luu_Y ();
do {
printf ("\n\n\tNHAN ENTER DE TIEP TUC ! ");
getch ();
clrscr ();
Menu ();
printf ("\tBan Chon Thao Tac Nao : ");
scanf ("%d",&Choice);
int Count = 1; //Dung De Dem So Lan Nhap Sai Yeu Cau Va Chuong Trinh
//Se Tu Dong Dung Neu Qua Gioi Hang Nhap Yeu Cau.
while (Choice < 1 || Choice > 7){ //Neu Nhap Sai.
Count += 1;
printf ("\t------Lua Chon Cua Ban Khong Dung Hoac Chua Co Trong Menu !-----");
printf ("\n\tVui Long Nhap Lai Lua Chon : ");
scanf ("%d",&Choice);
//Kiem Tra Nhap Yeu Cau
if (Count == 3){
printf ("\n\t------Ban Khong Muon Su Dung Chuong Trinh !------ ");
printf ("\n\t------Ban Da Nhap Sai 3 Lan ------");
printf ("\n\t------Chuong Trinh Tu Dong !------");
getch ();
exit (1);
}
}
switch (Choice){
case 1 : //Doi So Thap Phan Sang Nhi Phan.
int So;
printf ("\tNhap Vao So Can Chuyen : ");
scanf ("%d",&So);
Nhi_Phan (&S,So);
break;
case 2 : //Doi So Thap Phan Sang Thap Luc Phan.
printf ("\tNhap Vao So Can Chuyen : ");
scanf ("%d",&So);
Thap_Luc (&S,So);
break;
case 3 : //Doi So Thap Phan Sang Bat Phan.
printf ("\tNhap Vao So Can Chuyen : ");
scanf ("%d",&So);
Bat_Phan (&S,So);
break;
case 4 : //Kiem Tra 1 Bieu Thuc Toan.
char *BT = (char*) malloc (sizeof (char));
printf ("\n\tNhap Vao Bieu Thuc Toan : ");
cin >> BT;
if (KT_BieuThuc(&S,&S2,BT))
printf ("\tBieu Thuc Dung !");
else printf ("\tBieu Thuc Sai !");
break;
case 5 : //Dao Nguoc 1 Chuoi Ky Tu.
DaoChuoi (&S);
break;
case 6 : //Tinh Gia Tri 1 Bieu Thuc Toan Dang Hau To.
cout <<"\n\t--Chuong Trinh Con Han Che La Chi Tinh Duoc Bieu Thuc ";
cout <<"\n\tChua So Hang Tu 0 den 9\n";
cout <<"\n\t--Vui Long Nhap Ko Khoang Trang Va Nhap Bieu Thuc Dung Dang Hau To\n";
cout <<"\n\t--NHAN ENTER DE TIEN HANH NHAP BIEU THUC !"<<endl; getch ();
char *BT2;
cout << "\tPlease input : ";
cin >>BT2;
while (!BT_HauTo(BT2)){
cout <<"\n\tBieu Thuc Khong Phai Dang Hau To !\n";
cout <<"\tVui Long Kiem Tra Va Nhap Lai Bieu Thuc !\n";
cout <<"\tBieu Thuc : ";
cin >> BT2;
}
HauTo (&S,BT2);
break;
case 7 : // Thoat.
printf ("\n\tBan Co Chac La Muon Thoat Khong ?\n\tThoat (Y)/ Khong Thoat (N) ");
cin >>Ans;
while (Ans != 'Y' && Ans != 'y' && Ans != 'n' && Ans != 'N'){
cout << "\tBan Dong Y (Y) hay Khong (N) : ";
cin >> Ans;
}
if (Ans == 'n' || Ans == 'N')
break;
else exit (1);
}
}while (Choice != 7 || Ans == 'n' || Ans == 'N');
getch ();
return 0;
}
void Luu_Y (){ //Dua o Dau Chuong Trinh
textcolor (WHITE);
clrscr();
printf ("\n\t\t--------DH8TH2--------\n");
printf ("\n\tDo An 6 : Ung Dung Stack _ Cai Dat Bang Mang. \n");
printf ("\n\n Chuong Trinh Duoc Viet Boi : \n ");
printf ("\t1.Tran Van Tuan - DTH072273 \n");
printf ("\t2.Bui Duc Hanh - DTH072239 \n");
printf ("\t3.Truong Van Nam - DTH072250.\n");
printf ("\n\tChu Y : ");
printf ("\n\tKhong Nhap Cac Yeu Cau Ngoai Pham Vi Lua Chon Cua Chuong Trinh !");
printf ("\n\tNen Nhap Dung Theo Tung Chi Dan.");
}
void Menu (){ //Menu Lua Chon
textcolor (YELLOW);
clrscr ();
printf ("\n\t*---------------************************----------------------*\n");
printf ("\t| |\n");
printf ("\t| CHUONG TRINH UNG DUNG STACK DE GIAI CAC BAI TOAN CO BAN |\n");
printf ("\t| |\n");
printf ("\t| ----- * ----- |\n");
printf ("\t| Cac Lua Chon : |\n");
printf ("\t| |\n");
printf ("\t| 1.Dung Stack Doi So Thap Phan Sang Nhi Phan. |\n");
printf ("\t| 2.Dung Stack Doi So Thap Phan Sang Thap Luc Phan. |\n");
printf ("\t| 3.Dung Stack Doi So Thap Phan Sang Bat Phan. |\n");
printf ("\t| 4.Kiem Tra Mot Bieu Thuc Toan Hoc Dung Hay Sai. |\n");
printf ("\t| 5.Dao Nguoc Mot Chuoi Ky Tu Duoc Nhap Vao. |\n");
printf ("\t| 6.Tinh Gia Tri Mot Bieu Thuc Toan Hoc Dang Hau To. |\n");
printf ("\t| 7.Thoat Khoi Ung Dung |\n");
printf ("\t| |\n");
printf ("\t*-----****************-----------------*****************------*\n");
}
Position Empty_Stack (stack S){
return (S.Top == MaxLength ? True : False);
}
Position Full_Stack (stack S){
return (S.Top == 0 ? True : False);
}
void MakeNull_Stack (stack *S){
S -> Top = MaxLength;
}
Position top (stack S){
return S.Top;
}
Position Next_Top (stack *S){
return S -> Top++;
}
void Push (stack *S,ElementType X){
if (Full_Stack (*S))
printf ("Stack is Full !");
else {
S -> Top = S -> Top - 1;
S -> Element [S -> Top] = X;
}
}
Position Pop (stack S){
if (Empty_Stack (S)){
printf ("\tSorry ! Stack is Empty !");
return 0;
}
else
return S.Element[S.Top];
}
void Nhi_Phan (stack *S,int So){
MakeNull_Stack (S);
int Temp = So;
int SoDu;
if (So <= 0){
printf ("\n\tCo So Ban Nhap Sai, Vui Long Kiem Tra Lai !");
}
else{
while (So != 0) {
SoDu = So % 2;
Push (S,SoDu);
So = So / 2;
}
printf ("\t---So %d Dang Nhi Phan La : ",Temp);
while (!Empty_Stack (*S)){
printf ("%3x",Pop (*S));
Next_Top (S);
}
}
}
void Thap_Luc (stack *S,int So){
MakeNull_Stack (S);
int Temp = So;
int SoDu;
if (So <= 0){
printf ("\n\tCo So Ban Nhap Sai, Vui Long Kiem Tra Lai !");
}
else{
while (So != 0){
SoDu = So % 16;
Push (S,SoDu);
So = So / 16;
}
printf ("\t---So %d Dang Thap Luc La : ",Temp);
while (!Empty_Stack (*S)){
printf ("%3X",Pop (*S));
Next_Top (S);
}
printf (" (H)");
}
}
void Bat_Phan (stack *S,int So){
MakeNull_Stack (S);
int Temp = So;
int SoDu;
if (So <= 0){
printf ("\n\tCo So Ban Nhap Sai, Vui Long Kiem Tra Lai !");
}
else{
while (So != 0){
SoDu = So % 8;
Push (S,SoDu);
So = So / 8;
}
printf ("\t---So %d Dang Bat Phan La : ",Temp);
while (!Empty_Stack (*S)){
printf ("%3x",Pop (*S));
Next_Top (S);
}
}
}
int KT_BieuThuc (stack *S,stack *S2, char *BT){
MakeNull_Stack (S);
for (int i = 0; i <= strlen (BT);i++){
if (BT [i] == '(')
Push (S,1);
if (BT [i] == ')')
Push (S2,1);
}
return (top (*S) == top (*S2) ? True : False);
}
void DaoChuoi (stack *S){
MakeNull_Stack (S);
char Chuoi [200];
int Vitri = 0;
printf ("\n\tNhap Vao Chuoi So (0 De ket Thuc) : ");
while ((Chuoi [Vitri++] = getchar ()) != '0');
Chuoi [--Vitri] = '\0';
for (int i = 0;i < Vitri ;i++){
Push (S,Chuoi[i]);
}
printf ("\n\tChuoi Dao La : ");
while (!Empty_Stack (*S)){
printf ("%c",Pop (*S));
Next_Top (S);
}
}
int GanSo (char So){
int Temp;
switch (So){
case '0' : Temp = 0; break;
case '1' : Temp = 1; break;
case '2' : Temp = 2; break;
case '3' : Temp = 3; break;
case '4' : Temp = 4; break;
case '5' : Temp = 5; break;
case '6' : Temp = 6; break;
case '7' : Temp = 7; break;
case '8' : Temp = 8; break;
case '9' : Temp = 9; break;
}
return Temp;
}
int Tinh (char BT,int So1,int So2){
int KQ;
switch (BT){
case '+' : KQ = So1 + So2; break;
case '-' : KQ = So1 - So2; break;
case '*' : KQ = So1 * So2; break;
case '/' : KQ = So1 / So2; break;
case '$' : KQ = pow(So1,So2); break;
}
return KQ;
}
>>c̣n tiếp