PDA

View Full Version : Ứng dụng Stack Trong C++


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

Computer_Dark_Angle
10-07-2009, 08:44 PM
Đoạn code tiếp theo như sau:

int LaSo (char kt){
return (kt >= '0' && kt <= '9');
}

void HauTo (stack *S, char *BT){
MakeNull_Stack (S);
int Temp1,Temp2;
int KQ = 0;
for (int i=0;i<strlen(BT) ;i++){
if (LaSo (BT[i])) //Neu Phan Tu La So Thi Push Vao Stack.
Push (S,BT[i]);
else { //Nguoc Lai Thi Ta Se Tinh Gia Tri.
if (i <= 2){ //Chi 2 Phan Tu Dau Ta Can Phai Gan Gia Tri.
Temp2 = GanSo (Pop (*S)); //Can Gan Gia Tri Cho Phan Tu, Vi Truoc Do Phan Tu Duoc Khai Bao La
//Kieu char Nen Khong The Tinh Truc Tiep.
Next_Top (S);
Temp1 = GanSo (Pop (*S));
KQ = Tinh (BT[i],Temp1,Temp2);
Push (S,KQ);
}
else {
Temp2 = GanSo (Pop (*S));
Next_Top (S);
Temp1 = Pop (*S); //Khong Can Gan Gia Tri Cho KQ Lan Truoc.
KQ = Tinh (BT[i],Temp1,Temp2);
Push (S,KQ);
}
}
}
cout <<endl<<"\tKQ la : "<<KQ;
}

int BT_HauTo (char *BT){ //Kiem Tra B.Thuc Co Phai La B.Thuc Hau To ? ( Chua Hoan Chinh )
int i;
int KQ=1;
if (strlen (BT) == 2){
KQ = 0;
}
else {
for (i = 3;i < strlen (BT);i++){
if (!LaSo (BT[0]) || !LaSo (BT[1])){ //Toan Tu Dau La So, Toan Tu Thu 2 ko Phai La So -> Sai
KQ = 0;
break;
}
if (LaSo (BT[0]) && LaSo (BT[1]) && LaSo (BT[2])){ //3 Toan Tu Dau La So -> Sai
KQ = 0;
break;
}
if (!LaSo (BT[2]) && !LaSo (BT[3])){ //Toan Tu Thu 3 Va 4 Deu La B.Thuc (+,-,...) -> Sai
KQ = 0;
break;
}
if (LaSo (BT[strlen(BT)-1])){ //Toan Tu Cuoi Cung La So -> Sai
KQ = 0;
break;
}
if (LaSo(BT[i])){ //Tinh Tu Toan Tu Thu 3 Tro Ve Sau Xen Ke 1 So 1 B.Thuc (+,-,...)
if (LaSo(BT[i+1])){
KQ = 0;
break;
}
}
}
}
return KQ;
}


:(38)::(38):

thang122vn
03-03-2010, 12:14 AM
lỗi rồi bác ạ, hĩx.:(21):