Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Chuyển trung tố sang hậu tố trong C++ sử dụng ký pháp Balan

  1. #1
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Mặc định Chuyển trung tố sang hậu tố trong C++ sử dụng ký pháp Balan

    Code của mình, bạn có thể tham khảo qua, mình nghĩ đây là code tối ưu nhất đối với mảng.
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #define maxx 255
    4. using namespace std;
    5. struct anode{
    6.        char ope; int val;
    7. };
    8. struct node{
    9.        char ope; int val;
    10.        node *l,*r;
    11. };
    12. char num[10]={'0','1','2','3','4','5','6','7','8','9'};
    13. char ope[4]={'+' , '-' , '*' , '/'};
    14.  
    15. void read(string&);
    16. void write(anode[],int);
    17. bool isope(char);
    18. bool isnum(char);
    19. int power(int,int);
    20. int ctoi(char[],int);
    21. int prio(char);
    22. void get(string,anode[],int&);
    23.  
    24. int main(){
    25.     string expr; anode suff[maxx]; int n = 0;
    26.     read(expr);
    27.     get(expr,suff,n);
    28.     write(suff,n);
    29.     fflush(stdin); getchar();
    30.     return 0;
    31. }
    32.  
    33. void read(string &expr){
    34.      cout <<"Nhap bieu thuc tinh toan: ";
    35.      cin >>expr;
    36. }
    37. void write(anode suff[],int n){
    38.      cout <<"Chuyen thanh bieu thuc hau to: \n";
    39.      for (int i = 0;i < n;i++)
    40.      if (suff[i].ope != '.') cout <<suff[i].ope <<' ';
    41.      else cout <<suff[i].val <<' ';
    42.      cout <<endl;
    43. }
    44. bool isope(char c){
    45.      int i = 0;
    46.      while ((i < 4)&&(c != ope[i])) ++i;
    47.      if (i < 4) return true;
    48.      else return false;
    49. }
    50. bool isnum(char c){
    51.      int i = 0;
    52.      while ((i < 10)&&(c != num[i])) ++i;
    53.      if (i < 10) return true;
    54.      else return false;
    55. }
    56. int power(int x,int y){
    57.     int p = 1;
    58.     for (int i = 0;i < y;i++) p *= x;
    59.     return p;
    60. }
    61. int ctoi(char c[],int n){
    62.     int m = 0;
    63.     for (int i = 0; i <= n;i++){
    64.         int j = 0;    
    65.         while ((j < 10)&&(c[i] != num[j])) j++;
    66.         m += j*power(10,n-i);
    67.     }
    68.     return m;
    69. }
    70. int prio(char c){
    71.     if (c == '$') return 0;
    72.     else if ((c == '(')||(c == ')')) return 1;
    73.          else if ((c == '+')||(c == '-')) return 2;
    74.               else return 3;
    75. }
    76. void get(string expr,anode suff[],int& n){
    77.      char cnum[5],stack[maxx]; int m,top = 0,i = 0;
    78.      stack[top] = '$';
    79.      while (i < expr.size()){
    80.            if (isope(expr[i]))
    81.               if (prio(expr[i]) > prio(stack[top]))
    82.                  stack[++top] = expr[i++];
    83.               else{
    84.                    while (prio(expr[i]) <= prio(stack[top])){
    85.                          suff[n].val = -1;
    86.                          suff[n++].ope = stack[top--];
    87.                    }
    88.                    stack[++top] = expr[i++];
    89.               }
    90.            if (isnum(expr[i])){
    91.               m = -1;
    92.               while ((i < expr.size())&&(isnum(expr[i])))
    93.                     cnum[++m] = expr[i++];
    94.               m = ctoi(cnum,m);
    95.               suff[n].ope = '.';
    96.               suff[n++].val = m;
    97.            }
    98.            if (expr[i] =='(') stack[++top] = expr[i++];
    99.            if (expr[i] ==')'){
    100.               while (stack[top] != '('){
    101.                     suff[n].val = -1;
    102.                     suff[n++].ope = stack[top--];
    103.               }
    104.               top--;
    105.               i++;
    106.            }
    107.      }
    108.      while (stack[top] != '$'){
    109.            suff[n].val = -1;
    110.            suff[n++].ope = stack[top--];
    111.      }
    112. }
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 17-04-2011 lúc 07:31 PM. Lý do: Sửa lại tag code là C++ nhìn cho đẹp

  2. #2
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Sai là sai thế nào . Bạn nghĩ một người đến include mấy cái thư viện chuẩn mà còn sai lại post được hơn 600 bài ở cái forum này à .

    Chuẩn mới của C++ là header không kèm ".h", các object đều nằm trong namespace std. Không sai đâu bạn.
    Phá toái hư không - Bạch nhật thăng thiên.

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    chỉ thiếu stdio.h vì có thằng fflush(stdin); này

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Nhầm rồi coder_gate, flush mới của stdio.h, còn fflush là của iostream. Tui bỏ học C++ lâu lắm rồi nhưng vẫn chắc chắn với bạn điều này.

    To susumt: Tui chắc chắn nếu bạn chạy trên Dev C++ bảo đảm chạy tốt, trên Borland C++ hay Visual C++ thì tui ko dám chắc vì có thể lỗi ở thư viện.
    Đã được chỉnh sửa lần cuối bởi huynguyen : 28-10-2008 lúc 07:14 PM.

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Nhầm rồi coder_gate, flush mới của stdio.h, còn fflush là của iostream. Tui bỏ học C++ lâu lắm rồi nhưng vẫn chắc chắn với bạn điều này.

    To susumt: Tui chắc chắn nếu bạn chạy trên Dev C++ bảo đảm chạy tốt, trên Borland C++ hay Visual C++ thì tui ko dám chắc vì có thể lỗi ở thư viện.
    híc híc,mình nhớ loạn,2 thằng na ná quá, sorry huy nguyen nha,VC++ cũng chạy được code trên

  6. #6
    Ngày gia nhập
    05 2008
    Bài viết
    26

    Mặc định Chuyển trung tố sang hậu tố trong C++ sử dụng ký pháp Balan

    các bạn giải giúp mình bài này với:

    Viết chương trình gồm có 2 quá trình. Quá trình thứ nhất cho người dùng nhập vào từ bàn phím một chuỗi biễu diễn một phép tính gồm các phần tử +, -, (, ). Độ ưu tiên của các phép tính trong ngoặc (cặp dấu ( & )) là cao nhất, phép + và – cùng độ ưu tiên. Ví dụ:
    1+2+(2-3-4) –((3+4)-5)
    (1+(-2)–((3+4)-5))
    Sau đó truyền chuỗi dữ liệu này cho quá trình thứ hai. Quá trình thứ hai thực hiện tính toán trên và trả kết quả về cho quá trình thứ nhất để hiển thị cho người sử dụng biết.
    Thực hiện bài toán dùng message queue để giao tiếp giứa 2 quá trình.


    cảm ơn nhiều nhé.

  7. #7
    Ngày gia nhập
    10 2009
    Nơi ở
    Thiên đường.
    Bài viết
    1

    @ anh HuyNguyen: a có thể cho em xin code chuyển từ hậu tố sang trung tố được ko ạ? E ko làm được :((
    Em cảm ơn anh!

  8. #8
    Ngày gia nhập
    03 2012
    Nơi ở
    37-thiên hộ dương gò vấp
    Bài viết
    2

    Mặc định Thanks bồ vì đang cần cái này, sau đó nghiên cứu chuyển qua toán tử BOOL!!

    Quá tốt hihi đang cần cái thuật toán này để chuyển qua bool hihi thanks bồ!!

  9. #9
    Ngày gia nhập
    04 2012
    Nơi ở
    Bình Định (Đang học ở tphcm)
    Bài viết
    35

    Chuyển trung tố sang hậu tố bằng cây nhị phân:

    Cấu trúc:
    Code:
    typedef struct Node
    {
    	char s[20];
    	int ut;
    	struct Node *pL, *pR;
    }Node;
    Các hàm bổ trợ:
    Code:
    int UT(char *s,int k)//Lưu ý: khong có xử lý th nhập sai.
    {
    	if(s[0] == '+'||s[0]=='-') return (k+1);
    	if(s[0] == '*'||s[0] == '/') return (k+2);
    	if(s[0] == '^') return (k+3);
    	return (k+4);
    }
    
    Node* TaoNode(char *s,int k)
    {
    	Node* p = new Node;
    	if(p)
    	{
    		strcpy(p->s,s);
    		p->ut = UT(s,k);
    		p->pL = p->pR = NULL;
    	}
    	return p;
    }
    
    
    void Them(Node* &p,char *s, int k)
    {
    	if(!p)
    	{
    		p = TaoNode(s,k);
    		return;
    	}
    	if(p->ut>UT(s,k))
    	{
    		Node* q = TaoNode(s,k);
    		if(!q)return;
    		q->pL = p;
    		p = q;
    	}
    	else
    		Them(p->pR,s,k);
    }
    Hàm chuyển đổi:
    Code:
    //Hàm này trả về con trỏ đến cấu trúc cây lưu trữ!
    
    Node* Chuyen(char*fget)
    {
    	int k = 0;
    	Node* p = NULL;
    	char *s;
    	s = strtok(fget," ");
    	while(s)
    	{
    		if(s[0] == '(') k += 5;
    		else
    			if(s[0] == ')') k-= 5;
    			else
    				Them(p,s,k);
    		s = strtok(NULL," ");
    	}
    	return p;
    }

Các đề tài tương tự

  1. Chuyển đổi trung cấp nghề sang trung cấp chính quy 2012
    Gửi bởi cafetrungnguyen trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 16-07-2012, 04:24 PM
  2. Bị lỗi biên dịch khi sử dụng stack trong việc chuyển trung tố sang hậu tố
    Gửi bởi kuhoang0512 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 16
    Bài viết cuối: 05-11-2011, 01:17 AM
  3. Bài tập C Kỹ thuật Debug với DevC++ trong bài toán chuyển Trung tố sang Hậu tố
    Gửi bởi hienclubvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 20-09-2010, 10:26 PM
  4. Chuyển trung tố sang hậu tố trong C# như thế nào?
    Gửi bởi hoaxuyenchi trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 10-09-2010, 08:30 PM
  5. Chuyển Trung tố sang hậu tố trong C
    Gửi bởi huynguyen trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 14
    Bài viết cuối: 15-06-2010, 09:07 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn