<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
    十位數就不會算了,需要改進啊

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲av无码日韩av无码网站冲| 亚洲大尺码专区影院| 成年女人喷潮毛片免费播放| 一本色道久久综合亚洲精品蜜桃冫| 免费国产成人午夜电影| 中文在线免费视频| 亚洲中文无码av永久| 亚洲伊人久久综合中文成人网| 日本xxxx色视频在线观看免费| 亚洲精品国偷自产在线| 日本一区二区三区在线视频观看免费| 在线免费观看一级片| 亚洲一级毛片免费在线观看| 青草草在线视频永久免费| 亚洲成在人线aⅴ免费毛片| 亚洲精品二区国产综合野狼 | 国产97视频人人做人人爱免费| 亚洲a一级免费视频| 国产成人无码免费视频97| 无码A级毛片免费视频内谢| 蜜臀亚洲AV无码精品国产午夜.| 日韩中文无码有码免费视频| 成人爽a毛片免费| 亚洲国产日产无码精品| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 在线观看亚洲专区| 亚洲 另类 无码 在线| 97公开免费视频| 亚洲伊人久久大香线蕉结合| 最近免费中文字幕视频高清在线看| 国产精品免费观看视频| 亚洲色成人WWW永久在线观看| 黄色片在线免费观看| 成人无码视频97免费| 日韩色日韩视频亚洲网站| 91午夜精品亚洲一区二区三区| 亚洲性猛交XXXX| 免费精品国产自产拍在线观看图片 | 亚洲国产精品免费观看| 深夜国产福利99亚洲视频| 91嫩草免费国产永久入口|