mapcao91 Thành viên mới
Tổng số bài gửi : 12 Join date : 28/02/2011
| Tiêu đề: nl 1 giai phương trình bằng stack Mon Apr 04, 2011 9:51 pm | |
| dưới đây là bài của mình,sử dụng ngăn xếp.mình k đưa tên biến và xuất kết quả ra từng bước được.các bạn ơi,giúp mình với. - Code:
-
#include <stdio.h> #include <conio.h> #include <string.h>
#define MAX 100
#define PLUS 0 /* Dau cong */ #define MINUS 1 /* Dau tru */ #define MULTIPLE 2 /* Dau nhan */ #define DIVIDE 3 /* Dau chia */ #define LPAREN 4 /* Dau mo ngoac don */ #define RPAREN 5 /* Dau dong ngoac don */
int top;
struct { int toantu; } stack[MAX];
void push (int tt) { if (top < MAX-1) stack[++top].toantu = tt; }
int isempty() { return top == -1; }
int pop (int *tt) { if (!isempty()) { *tt = stack[top--].toantu; return 1; } return 0; }
int get (int *tt) { if (!isempty()) { *tt = stack[top].toantu; return 1; } return 0; }
void xet(int tt) { char chuoi[] = "+-*/"; int uutien[] = {0,0,1,1,-1,-1}; int toantu, done = 0, val;
if (isempty()) push(tt); else { do { if (get(&toantu)) { if (uutien[tt] <= uutien[toantu]) { pop(&toantu); printf("%c ", chuoi[toantu]); } else { push(tt); done = 1; } } else { done = 1; push(tt); } } while (!done); } }
void in_hauto(char *expr) { int len, i=0, ttu, done; char c, chuoi[]="+-*/"; top = -1; len = strlen(expr); do { c = expr[i++]; while (c == ' ' && i < len-1) c = expr[i++]; switch (c) { case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : printf("%c ", c); break; case '+' : xet(PLUS); break; case '-' : xet(MINUS); break; case '*' : xet(MULTIPLE); break; case '/' : xet(DIVIDE); break; case '(' : push(LPAREN); break; case ')' : done = 0; do { if (isempty()) { done = 1; printf("\n\nError\n"); } else { pop(&ttu); if (ttu != LPAREN) printf("%c ", chuoi[ttu]); else done = 1; } } while (!done); break; } } while (i < len); while (!isempty()) { pop(&ttu); printf("%c ", chuoi[ttu]); } } - Code:
-
/*Bai tap:chuong trinh tinh gia tri bieu thuc khi cho bieu thuc dang hau to*/ #include<stdio.h> #include<conio.h> #include<string.h> #define MAX 100 #include "trungto.cpp" typedef char ElementType; typedef struct { ElementType Element[MAX]; int Top_idx; }Stack;
/*khoi tao ngan xep */ void MakeNull_Stack(Stack *S) { (*S).Top_idx=MAX; }
//kiem tra ngan xep rong ElementType Empty_Stack(Stack S) { return S.Top_idx==MAX; }
//kiem tra nga xep day ElementType Full_Stack(Stack S) { return S.Top_idx==0; }
//them mot phan tu vao ngan xep void Push(ElementType X,Stack *S) { if(Full_Stack(*S)) printf("\nError :Ngan xep day"); else { (*S).Top_idx=(*S).Top_idx-1; (*S).Element[(*S).Top_idx]=X; } }
//tra ve phan tu dau ngan xep ElementType Top(Stack S) { if(!Empty_Stack(S))// printf("\nError :Ngan xep rong"); //else //{ return S.Element[S.Top_idx]; //} }
//xoa mot phan tu khoi ngan xep void Pop(Stack *S) { if(!Empty_Stack(*S)) //printf("\nError : Ngan xep rong"); // else //{ (*S).Top_idx=(*S).Top_idx+1; // } }
//in void Print_Stack(Stack S) { for(int i=S.Top_idx;i<MAX;i++) printf("%d ",S.Element[i]); }
ElementType GiaTri(char expr[],Stack S) { MakeNull_Stack(&S); //if(Empty_Stack(S)) printf("\nError :Ngan xep rong"); // else printf("tai sao"); for(int i=0;i<strlen(expr);i++) { if(expr[i]>='0'&&expr[i]<='9') {Push(expr[i]-'0',&S); } else { int x=Top(S); Pop(&S); int y=Top(S); Pop(&S); if(expr[i]=='+') Push(y+x,&S); else if(expr[i]=='-') Push(y-x,&S); else if(expr[i]=='*') Push(y*x,&S); else if(expr[i]=='/') Push(y/x,&S); } } return Top(S); } int main(){ char expr[50]; int done = 0;
//printf("\nChuong trinh in bieu thuc hau to tuong ung voi mot bieu thuc" // "trung to hop le" // "\nChu y :" // "\nCac toan hang chi tu 0 den 9" // "\nCac toan tu chi gom + - * / ( )\n"); do { printf("\nNhap mot bieu thuc trung to : "); gets(expr); if (strlen(expr) > 0) in_hauto(expr); else done = 1; } while ( done); // char ch='0'; Stack S; //char str[20]; printf("\nBieu thuc trung to vua nhap la:" ); in_hauto(expr); printf("\nNhap lai bieu thuc trung to tren :" ); gets(expr); //printf("%d",strlen(str)); printf("\nKet Qua : %d",GiaTri(expr,S)); GiaTri(expr,S); getch(); return 0; }
| |
|
mapcao91 Thành viên mới
Tổng số bài gửi : 12 Join date : 28/02/2011
| Tiêu đề: Re: nl 1 giai phương trình bằng stack Tue Apr 05, 2011 8:04 pm | |
| các bạn ơi có ai biết hok?giúp mình với
| |
|
mapcao91 Thành viên mới
Tổng số bài gửi : 12 Join date : 28/02/2011
| Tiêu đề: Re: nl 1 giai phương trình bằng stack Thu Apr 07, 2011 8:59 am | |
| co ai biet la xuat ket qua ra tung buoc sao hok?chi minh voi
| |
|
gentle_storm Thành viên tích cực
Tổng số bài gửi : 47 Join date : 03/01/2011
| Tiêu đề: Re: nl 1 giai phương trình bằng stack Thu Apr 07, 2011 9:02 am | |
| Bạn muốn xuất kết quả sao? Bạn nói rõ hơn được không? | |
|
mapcao91 Thành viên mới
Tổng số bài gửi : 12 Join date : 28/02/2011
| Tiêu đề: Re: nl 1 giai phương trình bằng stack Thu Apr 07, 2011 6:56 pm | |
| tức là khi mình thêm dấu '= tên biến' vào bên phải xong ui thì xuất kết quả ra từng bước. vd:9-1+4*2+3/1=x 9-1+8+3/1=x 9-1+8+3=x 8+8+3=x 16+3=x 19=x | |
|
gentle_storm Thành viên tích cực
Tổng số bài gửi : 47 Join date : 03/01/2011
| Tiêu đề: Re: nl 1 giai phương trình bằng stack Thu Apr 07, 2011 8:34 pm | |
| Mình gợi ý bạn thế này nhé, giờ mình cũng không rảnh để code dùm bạn(sắp thi rồi) mình in ra từng dòng, thay vi phải chuyển chuổi expr lại trung tố thì sao khi nhập xong bạn tạo thêm một mảng bandau[50] chẳng hạn. Sau đó gán bandau[i]=expr[i]. Vậy là bạn giữ lại được mảng ban đầu nhập vào, rồi viết thêm hàm in ra từng dòng, chẳng hạn inTungDong(char*) với tham số là mảng bandau. Bạn có thể tham khảo code trong chủ để này để in ra từng dòng cho một biểu thức: [You must be registered and logged in to see this link.]Chúc bạn thành công! | |
|
mapcao91 Thành viên mới
Tổng số bài gửi : 12 Join date : 28/02/2011
| Tiêu đề: Re: nl 1 giai phương trình bằng stack Sat Apr 09, 2011 3:42 pm | |
| bạn ơi,bạn có thể bỏ ra tí thời gian code jum mình hok?sao minh làm nó bị lỗi ùi.cảm ơn bạn rất nhiều | |
|
Sponsored content
| Tiêu đề: Re: nl 1 giai phương trình bằng stack | |
| |
|