<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hays

    海納百川
    posts - 25, comments - 48, trackbacks - 0, articles - 0
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    表達式求值(C實現)

    Posted on 2007-11-07 12:49 hays(海納百川) 閱讀(1659) 評論(2)  編輯  收藏
    #include <stdio.h>
    #include 
    <stdlib.h>
    #include 
    <string.h>
    #define MAXSIZE 
    4000;
    typedef struct 
    {
        
    char data[10];
        
    int top;//頭地址
        int base;//基地址
        int length;//長度
    }
    Stack;

    void init(Stack *st)//初始化棧
    {
        st
    ->base=0;
        st
    ->top=0;
        st
    ->length=0;
    }


    int isEmpty(Stack *st)
    {
        
    int n=0,top,base;
        top 
    =st->top;
        base 
    =st->base;
        
    if(top==base)
        
    {
            
    return 1;
        }

        
    return n;
    }


    int isFull(Stack *st)
    {
        
    int n=0,top,base;
        top 
    =st->top;
        
    if(top>=4000)
        
    {
            
    return 1;
        }

        
    return n;
    }


    char  getTop(Stack *st)// 返回top值,不改變棧的結構
    {
        
    char n;
        
    if(isEmpty(st))
        
    {
            printf(
    "棧為空\n");
            
    return 0;
        }

        
    int positon= st->top-1;
        n
    = st->data[positon];//取出數據;
        return n;
    }


    char  pop(Stack *st)// 出棧,返回
    {
        
    char n;
        
    if(isEmpty(st))
        
    {
            printf(
    "棧為空\n");
            
    return 0;
        }

        
    int positon= st->top-1;
        n
    = st->data[positon];//取出數據;

        st
    ->top--;
        st
    ->length--;
        st
    ->data[positon]='\0';//消除數據
        return n;
    }


    void push(char n,Stack *st)//入棧
    {
        
    int positon ;
        
    if(isFull(st))
        
    {
            printf(
    "棧滿\n");
            
        }

        
    else
        
    {
            positon
    = st->top;//獲取位置

            st
    ->data[positon]=n;//存入數據

            st
    ->top++;//改變位置
        }


    }


    void show(Stack *m1)//輸出棧中的數據
    {
        
    int top,base;
        top
    =m1->top;
        base
    =m1->base;
        
    while(top>base)
        
    {
            printf(
    "%c,",m1->data[--top]);
        }

        printf(
    "\n");
    }


    int isOperate(char temp)//是否是操作符
    {
        
    if(temp=='+'||temp=='-'||temp=='*'||temp=='/'||temp=='('||temp==')'||temp=='#')
        
    {
            
    return 1;
        }

        
    return 0;
    }


    int isValue(char temp)//是否是數值
    {
        
    if(temp>='0'&&temp<='9')//
        {
            
    return 1;
        }

        
    else
        
    {
            
    return 0;
        }

    }


    int isAvail(char temp)//是否有效字符
    {
        
    if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和數值的話,則它是非法的
        {
            
    return 1;
        }

        
    return 0;
    }


    int detect(char temp)//搜索矩陣位置
    {
        
    int i=0;
        
    char oper[7]={'+','-','*','/','(',')','#'};
        
    for(i=0;i<7;i++)
        
    {
            
    if(temp==oper[i])
            
    {
                
    return i;
            }

        }

    }


    char Priority(char temp,char optr)//判斷優先級
    {
        
    /*
                +  -  *  /  (  )  #
                1  2  3  4  5  6  7
            + 1 <  <  <  <  >  >  >   
            - 2 <  <  <  <  >  >  >
            * 3 >  >  <  <  >  >  >
            / 4 >  >  <  <  >  >  > 
            ( 5 >  >  >  >  >  =  0  
            ) 6 <  <  <  <  =  0  > 
            # 7 <  <  <  <  >  0  =
        
    */

        
    int row ,col;
        
    char priority[7][7]={/*      +      -      *   /      (   )   #                */        
                                 
    {'<','<','<','<','>','>','>'},

                                
    {'<','<','<','<','>','>','>'},

                                
    {'>','>','<','<','>','>','>'},

                                
    {'>','>','<','<','>','>','>'},

                                
    {'>','>','>','>','>','=','>'},

                                
    {'<','<','<','<','=','0','>'},

                                
    {'<','<','<','<','>','<','='},                            
                            }
    ;


        row 
    = detect(temp);//找出對應的矩陣下標;
        col = detect(optr);    
    //    printf("%d,%d",row,col);
          
        
    //優先級存儲在一個7x7的矩陣中,對應關系上圖;
        
        
    return priority[row][col];

    }

    char evaluate(int a,int b,char oper)
    {
        
    switch(oper)
        
    {
            
    case '+'return a+b+'0';
            
    case '-'return a-b+'0';
            
    case '*'return a*b+'0';
            
    case '/'return a/b+'0';
            
    default : return 0+'0';
        }

    }

    int calculateExpress(char *express)//計算表達式
    {
        
    int result=0;
        Stack OPTR,OPND;
    //OPTR存儲操作符,OPND操作數值
        init(&OPTR);
        init(
    &OPND);
        push(
    '#',&OPTR);//默認第一個位'#'

        
    ////////////////////-算法-////////////////////////////
        while(*express!='\0')
        
    {
            
    char temp;
            temp
    = *(express); 
            printf(
    "---------------------------------\n");
            printf(
    "當前的符號為%c\n",temp);
            
    if(isAvail(temp))//是否是有效字符
            {    
                    
    if(isOperate(temp) )//輸入的是操作符
                    {
                        
    char optr = getTop(&OPTR);//棧中top位的操作符
                        printf("棧頂操作符位:%c\n",optr);
                        
    char prior = Priority(temp,optr);//判斷優先級
                        switch(prior)
                        
    {
                            
    case '>':
                                        push(temp,
    &OPTR);
                                        printf(
    "將符號位%c入棧\n",temp);
                                        express
    ++;
                                        
    break;
                            
    case '<':
                                        
    int a,b;

                                        
    char oper,result;

                                        a
    =pop(&OPND)-'0';//存在棧中的都是char字符
                                        b=pop(&OPND)-'0';
                                        oper
    =pop(&OPTR);
                                        
                                        result
    =evaluate(b,a,oper);//出棧一個操作符,計算結果
                                        
    //printf("%d",result-'0');
                                        push(result,&OPND);//結果入OPND
                                        printf("%d%c%d結果為:%d\n",b,oper,a,result-'0');
                                        
    break;
                        
                            
    case '=':
                                        
    //消除括號
                                        pop(&OPTR);
                                        printf(
    "消除括號\n");
                                        express
    ++;
                                        
    break;
                            
                        }


                    }

                    
    if(isValue(temp))//輸入的是數值
                    {
                        push(temp,
    &OPND);//將數值位入棧;
                        express++;
                        printf(
    "將數值%c壓入棧\n",temp);
                        
    //show(&OPND);
                    }

            }

            
    else //表達式中有非法字符
            {
                printf(
    "表達式中有非法字符\n");
                exit(
    -1);//退出程序
            }

            
        
        }

    //    show(&OPND);
    //    show(&OPTR);
        return getTop(&OPND)-'0';
    }


    void inputExpress(char *express)//輸入表達式
    {
        
    int length=0;
        printf(
    "請輸入一個表達式:");
        scanf(
    "%s",express);
        
    int len =strlen(express);
        express[len]
    ='#';//表達式最后一位默認為'#';
        express[len+1]='\0';

    }


    void output(char *express,int result)//輸出表達式
    {
        
    int i=0;
        printf(
    "----------------------------------------\n表達式:");
        
    while(express[i]!='#')
        
    {
            printf(
    "%c",express[i]);
            i
    ++;
        }

        printf(
    "=%d\n",result);



    }


    void main()
    {
        
        
    char express[100];//表達式 
        int result =0;
        
        inputExpress(express);
    //輸入表達式
        
        result 
    = calculateExpress(express);//計算表達式;
        
        output(express,result);    
    //輸出表達式
        
        
    //、、、、、、、、、、、、、測試優先級。
        /*
        char m='7' ;
        m=Priority('+','*');
        printf("優先級為%c",m);
        
        int m=evaluate(5,6,'m');
        printf("%d",m);
        
    */

    }

    評論

    # re: 表達式求值(C實現)  回復  更多評論   

    2009-10-10 22:00 by www
    三百多行的代碼居然只能做算術運算?43+34=7 。。。。。

    # re: 表達式求值(C實現)  回復  更多評論   

    2011-12-20 19:50 by yelangjunjie
    十位數就不會算了,需要改進啊

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 浮力影院第一页小视频国产在线观看免费| eeuss在线兵区免费观看| 最近免费视频中文字幕大全| 亚洲人成网77777亚洲色| 久久一区二区三区免费| 亚洲熟女少妇一区二区| 青青操在线免费观看| 亚洲理论电影在线观看| 久久精品国产免费| 亚洲黄色在线电影| 无码区日韩特区永久免费系列 | 亚洲av无码一区二区三区在线播放| 16女性下面扒开无遮挡免费| 国产卡二卡三卡四卡免费网址| 亚洲AV本道一区二区三区四区| 久久aⅴ免费观看| 亚洲成在人线aⅴ免费毛片| xxx毛茸茸的亚洲| 在线观看视频免费完整版| 亚洲激情视频网站| 日日AV拍夜夜添久久免费| 菠萝菠萝蜜在线免费视频| 亚洲乳大丰满中文字幕| 9277手机在线视频观看免费| 亚洲精品免费在线| 国产精品免费一级在线观看| 九九九精品视频免费| 国精无码欧精品亚洲一区| 国产精彩免费视频| 国产青草亚洲香蕉精品久久| 亚洲日本va在线视频观看| 亚洲毛片免费视频| 四虎国产精品永免费| 中文字幕亚洲免费无线观看日本| 成人爽A毛片免费看| 国产精品免费久久久久电影网| 亚洲色av性色在线观无码| 国产精品久久久久影院免费| 久久国产精品免费视频| 亚洲第一第二第三第四第五第六| 亚洲三区在线观看无套内射|