<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(海納百川) 閱讀(1649) 評論(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
    十位數就不會算了,需要改進啊

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


    網站導航:
     
    主站蜘蛛池模板: 两个人看的www高清免费观看| 亚洲首页在线观看| 四虎永久免费地址在线观看| 免费人成视频在线| 成年女人18级毛片毛片免费观看| 100000免费啪啪18免进| 99在线精品免费视频九九视| 曰曰鲁夜夜免费播放视频| 91精品啪在线观看国产线免费| 99久久免费精品视频| 最近中文字幕高清免费中文字幕mv | 亚洲国产精品无码专区| 亚洲人成网7777777国产| 日本亚洲欧洲免费天堂午夜看片女人员 | 午夜爽爽爽男女免费观看影院| 99久久人妻精品免费一区| 91精品国产免费| 无码一区二区三区免费视频| 日韩免费观看一级毛片看看| 国产成人涩涩涩视频在线观看免费 | 日本成人在线免费观看| 国产18禁黄网站免费观看| 全部免费国产潢色一级| 亚洲伊人久久综合中文成人网| 亚洲午夜国产精品无码老牛影视 | 在线观看亚洲天天一三视| 亚洲国产精品无码久久久秋霞2| 亚洲成人中文字幕| 亚洲天堂免费在线| 免费很黄无遮挡的视频毛片| 最近更新免费中文字幕大全| 亚洲免费视频观看| 日本免费观看网站| 亚洲熟妇中文字幕五十中出| 久久亚洲私人国产精品| 亚洲人成电影网站色www| 日韩毛片免费一二三| 热re99久久6国产精品免费| 成人毛片免费观看视频大全| 久久精品国产亚洲AV不卡| 亚洲美女色在线欧洲美女|