<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 :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理
    #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值,不改變棧的結(jié)構(gòu)
    {
        
    char n;
        
    if(isEmpty(st))
        
    {
            printf(
    "棧為空\n");
            
    return 0;
        }

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


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

        
    int positon= st->top-1;
        n
    = st->data[positon];//取出數(shù)據(jù);

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


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

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

            st
    ->data[positon]=n;//存入數(shù)據(jù)

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


    }


    void show(Stack *m1)//輸出棧中的數(shù)據(jù)
    {
        
    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)//是否是數(shù)值
    {
        
    if(temp>='0'&&temp<='9')//
        {
            
    return 1;
        }

        
    else
        
    {
            
    return 0;
        }

    }


    int isAvail(char temp)//是否有效字符
    {
        
    if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和數(shù)值的話,則它是非法的
        {
            
    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)//判斷優(yōu)先級
    {
        
    /*
                +  -  *  /  (  )  #
                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);//找出對應(yīng)的矩陣下標(biāo);
        col = detect(optr);    
    //    printf("%d,%d",row,col);
          
        
    //優(yōu)先級存儲在一個7x7的矩陣中,對應(yīng)關(guān)系上圖;
        
        
    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)//計(jì)算表達(dá)式
    {
        
    int result=0;
        Stack OPTR,OPND;
    //OPTR存儲操作符,OPND操作數(shù)值
        init(&OPTR);
        init(
    &OPND);
        push(
    '#',&OPTR);//默認(rèn)第一個位'#'

        
    ////////////////////-算法-////////////////////////////
        while(*express!='\0')
        
    {
            
    char temp;
            temp
    = *(express); 
            printf(
    "---------------------------------\n");
            printf(
    "當(dāng)前的符號為%c\n",temp);
            
    if(isAvail(temp))//是否是有效字符
            {    
                    
    if(isOperate(temp) )//輸入的是操作符
                    {
                        
    char optr = getTop(&OPTR);//棧中top位的操作符
                        printf("棧頂操作符位:%c\n",optr);
                        
    char prior = Priority(temp,optr);//判斷優(yōu)先級
                        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);//出棧一個操作符,計(jì)算結(jié)果
                                        
    //printf("%d",result-'0');
                                        push(result,&OPND);//結(jié)果入OPND
                                        printf("%d%c%d結(jié)果為:%d\n",b,oper,a,result-'0');
                                        
    break;
                        
                            
    case '=':
                                        
    //消除括號
                                        pop(&OPTR);
                                        printf(
    "消除括號\n");
                                        express
    ++;
                                        
    break;
                            
                        }


                    }

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

            }

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

            
        
        }

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


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

    }


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

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



    }


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

    }

    評論

    # re: 表達(dá)式求值(C實(shí)現(xiàn))  回復(fù)  更多評論   

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

    # re: 表達(dá)式求值(C實(shí)現(xiàn))  回復(fù)  更多評論   

    2011-12-20 19:50 by yelangjunjie
    十位數(shù)就不會算了,需要改進(jìn)啊

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产亚洲欧洲Aⅴ综合一区| 国产免费伦精品一区二区三区| 亚洲国产成人久久| 精品视频免费在线| 一区二区免费视频| 国产免费观看视频| 亚洲国产精品丝袜在线观看| 亚洲AV无码成人精品区在线观看 | 亚洲一级片在线播放| 黄色大片免费网站| 国产成人高清精品免费观看| 黄+色+性+人免费| 亚洲国产一区二区三区| 亚洲大香伊人蕉在人依线| 一区二区三区免费电影| 青娱乐免费视频在线观看| 精品国产亚洲男女在线线电影| 亚洲人成电影网站| 三级黄色片免费看| 国产精品麻豆免费版| 中文字幕日韩亚洲| 亚洲色无码国产精品网站可下载| 国产精品1024在线永久免费| 毛片免费观看的视频| 亚洲国产天堂在线观看| 中国china体内裑精亚洲日本| 国内精品99亚洲免费高清| 日本高清免费不卡视频| 亚洲自偷自偷图片| 亚洲av综合日韩| 67194熟妇在线永久免费观看| 中文亚洲AV片在线观看不卡| 色偷偷亚洲第一综合网| 在线看片韩国免费人成视频| 亚洲妇熟XXXX妇色黄| 日韩a毛片免费观看| 182tv免费视视频线路一二三| 日日夜夜精品免费视频| 亚洲天堂一区在线| 日韩免费无码一区二区三区| 大学生一级特黄的免费大片视频|