| | STACK THI VAO DAY NHA(UPDATE) \:d/ | |
| | Tác giả | Thông điệp |
---|
mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: STACK THI VAO DAY NHA(UPDATE) :d/ Sat Sep 18, 2010 12:30 pm | |
| ĐÂY LÀ BẢN DEMO TỚ VIẾT VỀ VIỆC CHUYỂN TỪ TRUNG TỐ SANG HẬU TỐ MỌI NGƯỜI VÀO THẢO LUẬN NHÁ
#include<conio.h> #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { char item; struct node *next; };
typedef struct node *stacknode;
typedef struct { stacknode top; }stack;
char num[10]={'0','1','2','3','4','5','6','7','8','9'}; char ope[4]={'+','-','*','/'};
//tao stack void StackInit(stack *s) { s->top=NULL; }
//kiem tra ngan xep rong int EmptyStack(stack s) { if(s.top==NULL) return 1; else return 0; }
//day ki tu vao ngan xep void push(stack *s,char x) { stacknode p; p=(stacknode)malloc(sizeof(struct node)); p->item=x; p->next=s->top; s->top=p; }
//day ki tu ra ngan xep void pop(stack *s) { stacknode p; if( EmptyStack(*s) ) printf("ngan xep rong"); p=s->top; s->top=s->top->next; printf("%c",p->item); free(p); }
//ham xoa phan tu dau ngan xep void delTop(stack *s) { stacknode p; if( EmptyStack(*s) ) printf("ngan xep rong"); p=s->top; s->top=s->top->next; free(p); }
//ham kiem tra do uu tien cua toan tu int kiemTraDoUuTien(char a) { if ( a == '+'|| a == '-' ) return 1; if ( a == '*'|| a == '/' ) return 2; }
//ham kiem tra ki tu co phai la toan tu bool kiemTraToanTu(char a) { int i=0; while( i<4 && a != ope[i] ) i++; if( i < 4 ) return true; else return false; }
//ham kiem tra ki tu co phai la so bool kiemTraSo(char a) { int i=0; while(i<10&&a!=num[i]) i++; if(i<10) return true; else return false; }
void chuyenSangHauTo(stack *s,char *a) { int i=0,n; n=strlen(a); while(i<n) { if( kiemTraSo(a[i]) || a[i]=='.' ) printf("%c",a[i]); //neu la so thi in ra if( a[i]=='(' ) push( s,a[i] ); //neu la mo ngoac thi dua vao ngan xep if( a[i]==')' ) //neu la dong ngoac { while( s->top->item != '(' ) //dua ki tu ra khoi ngan xep cho den khi gap mo ngoac pop(s); delTop(s); } if(kiemTraToanTu( a[i]) ) //neu gap toan tu { if( !EmptyStack(*s) ) { while( kiemTraDoUuTien(s->top->item) > kiemTraDoUuTien(a[i]) ) pop(s); } push( s,a[i] ); } i++; } while( !EmptyStack(*s) ) pop(s); //dua not ki tu lai trong ngan xep ra ngoai }
int main() { char a; stack s; StackInit(&s); printf("Nhap bieu thuc so hoc dang trung to\n\n"); printf("Chu y : Viet lien khong cach (Nhap xong nhan Enter)\n\n"); fflush(stdin); gets(&a); printf("\nTa duoc bieu thuc hau to tuong ung sau\n\n"); chuyenSangHauTo(&s,&a); printf("\n\nNhan phim bat ky de out"); getch(); }
Được sửa bởi mrmax ngày Sun Sep 19, 2010 5:17 am; sửa lần 2. | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Sun Sep 19, 2010 2:55 am | |
| CÒN ĐÂY LÀ BÀI TÍNH GIÁ TRỊ BIỂU THỨC HẬU TỐ #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int item; struct node *next; };
typedef struct node *stacknode;
typedef struct { stacknode top; }stack;
char num[10]={'0','1','2','3','4','5','6','7','8','9'}; char ope[4]={'+','-','*','/'};
//tao stack void StackInit(stack *s) { s->top=NULL; }
//kiem tra ngan xep rong int EmptyStack(stack s) { if(s.top==NULL) return 1; else return 0; }
//day ki tu vao ngan xep void push(stack *s,int x) { stacknode p; p=(stacknode)malloc(sizeof(struct node)); p->item=x; p->next=s->top; s->top=p; }
//day ki tu ra ngan xep int pop(stack *s) { stacknode p; if( EmptyStack(*s) ) printf("ngan xep rong"); p=s->top; s->top=s->top->next; return p->item; free(p); }
//HAM KIEM TRA KI TU CO PHAI LA TOAN TU HAY KHONG bool kiemTraToanTu(char a) { int i=0; while( i<4 && a != ope[i] ) i++; if( i < 4 ) return true; else return false; }
//ham kiem tra ki tu co phai la so bool kiemTraSo(char a) { int i=0; while(i<10&&a!=num[i]) i++; if(i<10) return true; else return false; }
//HAM CHUYEN KI TU SO THANH SO int charToNum(char a) { switch(a) { case '0' : return 0; break; case '1' : return 1; break; case '2' : return 2; break; case '3' : return 3; break; case '4' : return 4; break; case '5' : return 5; break; case '6' : return 6; break; case '7' : return 7; break; case '8' : return 8; break; case '9' : return 9; break; } }
//HAM THUC HIEN PHAP TINH SO HOC GIUA 2 PHAN TU DUOC DAY RA TU NGAN XEP int tinhToan(int a,int b,char op) { switch(op) { case '+' : return (a+b); break; case '-' : return (b-a); break; case '*' : return (a*b); break; case '/' : return (a/b); break; } }
//CAI NAY DE TINH GIA TRI BIEU THUC HAU TO DUA TREN CAC HAM DINH NGHIA O TREN void tinhHauTo(stack *s,char *a) { int i=0,n,num1,num2,equal; n=strlen(a); while(i<n) { if( kiemTraSo(a[i]) ) push(s,charToNum(a[i])); if( kiemTraToanTu(a[i]) ) { num1=pop(s); num2=pop(s); equal=tinhToan(num1,num2,a[i]); push(s,equal); } i++; } printf("%d",pop(s)); }
//HAM SUNG SUONG ) int main() { char a; stack s; StackInit(&s); printf("Nhap bieu thuc so hoc dang hau to\n\n"); printf("Chu y : Viet lien khong cach (Nhap xong nhan Enter)\n\n"); fflush(stdin); gets(&a); printf("\nKet qua bieu thuc hau to\n\n"); tinhHauTo(&s,&a); printf("\n\nNhan phim bat ky de out"); getch(); }
| |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Sun Sep 19, 2010 3:05 am | |
| có mấy vấn đề cần thảo luận ở đây là: 1.Liệu có cách nào dung hợp 2 bài toán này làm 1 không Vấn đề: Sự khác nhau cơ ban giữa 2 thằng này là 1 thao tác ngăn xếp với số và 1 thao tác với kí tự 2.Liệu có cách nào tính biểu thức hậu tố với các số có nhiều hơn 1 chữ số hay không Thực chất 2 vấn đề này được đặt ra vì 1.Bài chuyển từ trung tố sang hậu tố thì vô tư mấy chữ số cũng chơi kể cả dấu phẩy động 2.Bài tính biểu thức hậu tố theo mình hình như không thể tính đối với các con số có nhiều hơn 1 chữ số vì biểu thức hậu tố không phân biệt được đâu là ranh giới giữa các con số 3.Là vì hình như có mình tôi đang độc thoại thì phải(các bố chả có tính xây dựng j cả) Buồn 1s | |
| | | doraemon
Tổng số bài gửi : 4 Points : 5008 Reputation : 0 Join date : 08/09/2010 Age : 33 Đến từ : ĐH Bách khoa Hà Nội
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Sun Sep 19, 2010 6:52 am | |
| cậu ơi bình tĩnh tớ h mới đang ôn lại mà sao mà đóng góp ý kiến nhanh thế đc | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Sun Sep 19, 2010 10:38 pm | |
| bài chuyển trung tố sang hâu tố có vấn đề với nhưng biểu thức có toán tử nhân chia ở đầu biểu thức nhưng không có ngoặc đi kèm VD: 2*3+4 --> lỗi nhưng (2*3)+4 thì lại ok hoặc 4+2*3-->ok
í tưởng bài tính biểu thức hậu tố với số có nhiều chữ số có lễ bằng cách nhận dạng dấu cách(space)
mọi người cùng cố gắng đóng góp í kiến để cải thiện thuật toán | |
| | | bakuryu90
Tổng số bài gửi : 8 Points : 5019 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Mon Sep 20, 2010 11:51 pm | |
| để nghiên cứu lại bài ông Thành vậy
Được sửa bởi bakuryu90 ngày Tue Sep 21, 2010 12:47 am; sửa lần 1. | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Tue Sep 21, 2010 12:07 am | |
| có mấy điều cần nói 1.bài nào up lên trước thì người trong nhóm up sau lấy bài đó làm mẫu hàm và mẫu biến để viết chương trình của mình để dễ theo dõi và ráp code.tên tuổi phải được thống nhất. 2.khi up không nhất thiết phải up cả bài chỉ cần trích dẫn đoạn sửa chữa và đoạn bổ sung 3.chỉnh sửa code dễ đọc dễ hiểu trước khi up | |
| | | bakuryu90
Tổng số bài gửi : 8 Points : 5019 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Wed Sep 22, 2010 2:32 pm | |
| void chuyenSangHauTo(stack *s,char *a) { int i=0,n; n=strlen(a); while(i<n) { if( kiemTraSo(a[i]) || a[i]=='.' ) printf("%c",a[i]); //neu la so thi in ra if( a[i]=='(' ) push( s,a[i] ); //neu la mo ngoac thi dua vao ngan xep if( a[i]==')' ) //neu la dong ngoac { while( s->top->item != '(' ) //dua ki tu ra khoi ngan xep cho den khi gap mo ngoac pop(s); delTop(s); } if(kiemTraToanTu( a[i]) ) //neu gap toan tu {if(!EmptyStack(*s)) if(kiemTraDoUuTien(s->top->item) > kiemTraDoUuTien(a[i])) while ((!EmptyStack(*s))&&(s->top->item!='(')) pop(s);
push(s,a[i]); } i++; } while( !EmptyStack(*s) ) pop(s); //dua not ki tu lai trong ngan xep ra ngoai }
Thử thay đoạn này vào coi có lỗi ko | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Thu Sep 23, 2010 9:43 am | |
| OK MAN.VẬY NHÓM TA CHÍNH THỨC XONG BÀI CHUYỂN SANG HẬU TỐ.CÒN BÀI TÍNH HẬU TỐ NỮA.CHÚNG TA SẼ PHÁT TRIỂN THUẬT TOÁN ĐỂ TÍNH SỐ CÓ NHIỀU HƠN 1 CHỮ SỐ.MỌI NGƯỜI CÙNG CỐ GẮNG ĐỂ KỊP TIẾN ĐỘ | |
| | | doraemon
Tổng số bài gửi : 4 Points : 5008 Reputation : 0 Join date : 08/09/2010 Age : 33 Đến từ : ĐH Bách khoa Hà Nội
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Thu Sep 23, 2010 10:25 am | |
| #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> #include<math.h>
struct StackNode{ float item; StackNode *next; };
struct Stack{ StackNode *top; }; char num[10]={'0','1','2','3','4','5','6','7','8','9'}; char ope[5]={'+','-','*','/','^'};
//khoi tao ngan xep Stack *StackConstruct(Stack *s){ s=(Stack *)malloc(sizeof(Stack)); if(s==NULL){ return NULL; } s->top=NULL; return s; }
//kiem tra ngan xep rong int StackEmpty(Stack *s){ return (s->top==NULL); }
//thong bao stack tran int StackFull(){ printf("\n nhan xep tran"); getch(); return 0; }
//day ki tu vao ngan xep int StackPush(Stack *s,float item){ StackNode *node; node=(StackNode*)malloc(sizeof(StackNode)); if(node==NULL){ StackFull(); return 1; } node->item=item; node->next=s->top; s->top=node; return 0; }
//lay ra khoi ngan xep int StackPop(Stack *s){ StackNode *node; if(StackEmpty(s)){ printf("\n Ngan xep rong"); } node=s->top; s->top=s->top->next; printf("%c",node->item); free(node); }
//ham xoa phan tu dau ngan xep void StackDelTop(Stack *s){ StackNode *node; if( StackEmpty(s) ){ printf("ngan xep rong"); } node=s->top; s->top=s->top->next; free(node); }
//ham kiem tra do uu tien cua toan tu int KiemTraDoUuTien(char a){ if ( a == '+'|| a == '-' ) return 1; if ( a == '*'|| a == '/' ) return 2; if ( a == '^') return 3; }
//ham kiem tra ki tu co phai la toan tu bool TestOpe(char a){ int i=0; while( i<4 && a != ope[i] ) i++; if( i < 4 ) return true; else return false; }
//ham kiem tra ki tu co phai la so bool TestNum(char a){ int i=0; while(i<10&&a!=num[i]) i++;//can sua o day if(i<10) return true; else return false; }
//Chuyen ki tu thanh so int CharToNum(char a) { switch(a) { case '0' : return 0; break; case '1' : return 1; break; case '2' : return 2; break; case '3' : return 3; break; case '4' : return 4; break; case '5' : return 5; break; case '6' : return 6; break; case '7' : return 7; break; case '8' : return 8; break; case '9' : return 9; break; } }
//thuc hien phep tinh double Calculate(int a,int b,char ope) { switch(ope) { case '+' : return (a+b); break; case '-' : return (b-a); break; case '*' : return (a*b); break; case '/' : return (a/b); break; case '^' : return (pow(a,b));break; } }
//chuyen sang hau to void InToPost(Stack *s,char *a){ int i=0,n; n=strlen(a); while(i<n){ if( TestNum(a[i]) || a[i]=='.' ) printf("%c",a[i]); //neu la so thi in ra if( a[i]=='(' ) StackPush( s,a[i] ); //neu la mo ngoac thi dua vao ngan xep if( a[i]==')' ){ //neu la dong ngoac while( s->top->item != '(' ) //dua ki tu ra khoi ngan xep cho den khi gap mo ngoac StackPop(s); StackDelTop(s); } if(TestOpe(a[i])){ //neu gap toan tu if(!StackEmpty(s)){ while( KiemTraDoUuTien(TestOpe(a[i])) > KiemTraDoUuTien(a[i]) ) StackPop(s); } StackPush(s,a[i]); } i++; } while( !StackEmpty(s) ) StackPop(s); //dua not ki tu lai trong ngan xep ra ngoai }
//tinh gia tri bieu thuc hau to void PostCalculator(Stack *s,char *a){ int i=0,n,num1,num2; double equal; n=strlen(a); while(i<n){ if( TestNum(a[i]) ) StackPush(s,CharToNum(a[i])); if( TestOpe(a[i]) ){ num1=StackPop(s); num2=StackPop(s); equal=Calculate(num1,num2,a[i]); StackPush(s,equal); } i++; } printf("%d",StackPop(s)); }
int main() { char a; Stack s; StackConstruct(&s); printf("Nhap bieu thuc so hoc dang trung to\n\n"); printf("Chu y : Viet lien khong cach (Nhap xong nhan Enter)\n\n"); fflush(stdin); gets(&a); printf("\nTa duoc bieu thuc hau to tuong ung sau\n\n"); InToPost(&s,&a); printf("\n Gia tri bieu thuc hau to"); PostCalculator(&s,&a); printf("\n\nNhan phim bat ky de out"); getch(); } tớ đã kết hợp 2 phần trung tố sang hậu tố với tính giá trị biểu thức nhưng ko ổn lắm kết quả phần trung tố sang hậu tố ko in ra phép toán nhờ mọi người test giúp | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Thu Sep 23, 2010 11:18 am | |
| 1.ngăn xếp kiểu float thì không thao tác đc với kiểu char 2.các hàm thành phần trả lại kiểu dữ liệu lung tung push và pop sao lại trả lại kiểu dữ liệu int 3.các hàm khai báo tạo lập stack có vấn đề s=(Stack *)malloc(sizeof(Stack)); không ai lại đi khai báo cấp phát bộ nhớ kiểu này vvv | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Fri Sep 24, 2010 9:18 pm | |
| chốt hạ hàm tính hậu tố.tính được với số có nhiều chữ số và sỗ thực(nhớ có dấu cách giữa các chữ số) //CAI NAY DE TINH GIA TRI BIEU THUC HAU TO DUA TREN CAC HAM DINH NGHIA O TREN void tinhHauTo(stack *s,char *a) { int i=0,n; double num1,num2,equal; n=strlen(a); while(i<n) { double num=0; if ( (kiemTraSo(a[i])) || a[i]=='.' ) { while(kiemTraSo(a[i])) { num=num*10+charToNum(a[i]); i++; } if( a[i]=='.' ) { i++; while(kiemTraSo(a[i])) { num=num+charToNum(a[i])*0.1; i++; } } push(s,num); } if( kiemTraToanTu(a[i]) ) { num1=pop(s); num2=pop(s); equal=tinhToan(num1,num2,a[i]); push(s,equal); i++; } if(a[i]==' ') i++; } printf("%f",pop(s)); } | |
| | | mrmax
Tổng số bài gửi : 59 Points : 5111 Reputation : 0 Join date : 01/09/2010
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ Fri Sep 24, 2010 10:02 pm | |
| sửa lại chỗ này
while(kiemTraSo(a[i])) { num=num+charToNum(a[i])*0.1; i++; }
thành thế này
if( a[i]=='.' ) { int j=1; i++; while(kiemTraSo(a[i])) { num=num+charToNum(a[i])*pow(10,-j); i++; j++; } } | |
| | | Sponsored content
| Tiêu đề: Re: STACK THI VAO DAY NHA(UPDATE) \:d/ | |
| |
| | | | STACK THI VAO DAY NHA(UPDATE) \:d/ | |
|
Trang 1 trong tổng số 1 trang | |
Similar topics | |
|
| Permissions in this forum: | Bạn không có quyền trả lời bài viết
| |
| |
| |