• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 21,  comments - 9,  trackbacks - 0
            今天刷刷我們學(xué)校的OJ。看到了那道我們大家都熟悉的表達(dá)式求值題目。去網(wǎng)上搜了下,發(fā)現(xiàn)沒(méi)有現(xiàn)成可用的好的算法。于是自己花了點(diǎn)時(shí)間寫(xiě)了個(gè)。沒(méi)有做過(guò)多優(yōu)化,先發(fā)出來(lái)再說(shuō)。
              1#include<stdio.h>
              2#include<string.h>
              3#include<stack>
              4using namespace std;
              5
              6char exp[1100];
              7char num[100];//此數(shù)組用來(lái)把字符數(shù)字轉(zhuǎn)化為整數(shù)
              8
              9stack<char> cstack;
             10stack<double> nstack;
             11
             12int n;
             13
             14int convert(int length)
             15{
             16    int value = 0;
             17    for(int i = 0;i < length;++i)
             18    {
             19        value = value * 10 + num[i]-'0';
             20    }

             21    return value;
             22}

             23
             24//判斷a運(yùn)算符比b優(yōu)先。如果是的話,那么返回1如果不是的話,返回0
             25int order(char a ,char b)
             26{
             27    if(a == '*' || a == '/')
             28    {
             29        return 1;
             30    }

             31    if(a == '+' || a == '-')
             32    {
             33        if(b == '*' || b== '/')
             34            return 0;
             35        else
             36            return 1;
             37    }

             38    return 0;
             39}

             40
             41//這個(gè)函數(shù)用來(lái)判斷字符是數(shù)字還是運(yùn)算符
             42
             43int judge(char c)
             44{
             45    if(c <= '9' && c >= '0')
             46        return 1;
             47    else
             48        return 0;
             49}

             50
             51
             52double go(char c,double n1,double n2)
             53{
             54    if(c == '+')
             55        return n1 + n2;
             56    else
             57        if(c == '-')
             58            return n1 - n2;
             59    else
             60        if(c == '*')
             61            return n1 * n2;
             62    else
             63        if(c == '/')
             64            return n1 / n2;
             65    return 0;
             66}

             67
             68int ignoreKuohao(stack<char> &ccstack,stack<double>& nnstack)
             69{
             70    while(!ccstack.empty() && ccstack.top()!='(')
             71    {
             72        char c1 = ccstack.top(); ccstack.pop();
             73        double n1 = nnstack.top();    nnstack.pop();
             74        double n2 = nnstack.top();    nnstack.pop();
             75        if(ccstack.empty())
             76        {
             77            nnstack.push(go(c1,n1,n2));
             78            break;
             79        }

             80        else
             81        {
             82            char c2 = ccstack.top(); ccstack.pop();
             83            if(order(c1,c2))
             84            {
             85                double k = go(c1,n1,n2);
             86                ccstack.push(c2);
             87                nnstack.push(k);
             88            }

             89            else
             90            {
             91                //nnstack.push(n1);
             92                double n3 = nnstack.top();nnstack.pop();
             93                double k = go(c2,n2,n3);
             94                nnstack.push(k);
             95
             96                k = nnstack.top();
             97                nnstack.push(n1);
             98
             99                k = nnstack.top();
            100                ccstack.push(c1);
            101            }

            102        }

            103    }

            104    if(!ccstack.empty() && ccstack.top() == '(')
            105    {
            106        ccstack.pop();
            107    }

            108
            109    return 0;
            110}

            111
            112
            113
            114//事實(shí)證明,在沒(méi)有括號(hào)的情況下,應(yīng)該從前往后進(jìn)行計(jì)算
            115void inKuohao()
            116{
            117    char c = cstack.top();
            118    stack<char> ccstack;
            119    stack<double> nnstack;
            120    //把括號(hào)內(nèi)的表達(dá)式逆過(guò)來(lái)
            121    int n = nstack.top();
            122    nnstack.push(n);
            123    nstack.pop();
            124    while(c != '(')
            125    {
            126        cstack.pop();
            127        ccstack.push(c);
            128
            129        nnstack.push(nstack.top());
            130        nstack.pop();
            131        if(cstack.empty())
            132            break;
            133        c = cstack.top();
            134    }

            135    if(!cstack.empty())
            136    {
            137        cstack.pop();
            138    }

            139    ignoreKuohao(ccstack,nnstack);
            140    nstack.push(nnstack.top());
            141    nnstack.pop();
            142}

            143
            144int calc(int j)
            145{
            146    int i = 0;
            147    int length = 0;
            148//    stack<char> cstack;
            149//    stack<int> nstack;
            150    for(i = 0;i <= j ;++i )
            151    {
            152        if(judge(exp[i]))
            153        {
            154            num[length ++ ] = exp[i];
            155        }

            156        else
            157        {
            158            if(judge(exp[ i - 1]))//如果上一個(gè)是數(shù)字的話,就入棧.這個(gè)判斷是為了防止出現(xiàn)(2 + 1 )/2。這種情況
            159            {
            160                int k = convert(length);
            161                nstack.push(k);
            162                length = 0;
            163            }

            164            if(exp[i] == ')')
            165                {
            166                    inKuohao();
            167                }

            168            else
            169                if(exp[i] == '#')
            170                    break;
            171            else
            172                cstack.push(exp[i]);
            173        }

            174    }

            175    if(!cstack.empty())
            176    {
            177        inKuohao();
            178    }

            179    int k =(int) nstack.top();
            180    printf("%d\n",k);
            181    return k;
            182}

            183
            184int main()
            185{
            186    scanf("%s",exp);
            187    int j = strlen(exp);
            188    exp[j] = '#';
            189    exp[j + 1= '\0';
            190    calc(j);
            191    return 0;
            192}

            193
            posted on 2011-04-24 21:00 崔佳星 閱讀(294) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法
            <2012年4月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品久久久久一区二区三区| 中文精品久久久久人妻不卡| 国产亚洲欧美成人久久片| 国产成人精品免费久久久久| 国产成人99久久亚洲综合精品| 亚洲欧美国产精品专区久久| av无码久久久久久不卡网站| 久久97久久97精品免视看秋霞| 久久免费的精品国产V∧| 久久久久久久综合日本| 日韩精品久久无码中文字幕| 久久九九免费高清视频| 精品熟女少妇av免费久久| 深夜久久AAAAA级毛片免费看| 97久久天天综合色天天综合色hd| 蜜臀av性久久久久蜜臀aⅴ| 国产精品无码久久综合网| 精品久久久久香蕉网| 久久这里只精品99re66| 久久亚洲欧洲国产综合| av午夜福利一片免费看久久| 亚洲午夜久久久久久久久久| 久久久亚洲精品蜜桃臀| 久久国产V一级毛多内射| 国产精品久久久久影视不卡| 久久精品国产久精国产思思| 无码人妻久久一区二区三区| 伊人久久综合成人网| 99久久国产亚洲综合精品| 久久综合久久性久99毛片| 无码精品久久一区二区三区| 久久久久人妻一区精品果冻| 久久艹国产| 色综合久久天天综线观看| 亚洲国产成人乱码精品女人久久久不卡 | 久久久久久夜精品精品免费啦| 久久香综合精品久久伊人| 精品久久久久成人码免费动漫 | 999久久久国产精品| 99热热久久这里只有精品68| 久久99热狠狠色精品一区|