• <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国产精品99久久| 91亚洲国产成人久久精品| 久久国产精品成人免费| 91精品国产高清久久久久久91 | 亚洲国产精品无码久久SM| 欧美国产成人久久精品| 久久久一本精品99久久精品88| 99久久精品影院老鸭窝| 国产精品九九久久免费视频 | 久久激情亚洲精品无码?V| 7777精品伊人久久久大香线蕉| 久久婷婷国产剧情内射白浆 | 9191精品国产免费久久| 伊人久久亚洲综合影院| 99久久中文字幕| 久久亚洲日韩看片无码| 9191精品国产免费久久| 18岁日韩内射颜射午夜久久成人 | 亚洲天堂久久久| 国内精品九九久久久精品| 亚洲国产成人久久综合碰| 久久国产欧美日韩精品| 日韩久久无码免费毛片软件| 国产精品久久久久国产A级| 久久亚洲欧洲国产综合| 久久―日本道色综合久久| 2019久久久高清456| 久久久黄片| 青草影院天堂男人久久| 久久精品国产第一区二区三区| 香蕉久久影院| 色8激情欧美成人久久综合电| 日本免费一区二区久久人人澡| 嫩草伊人久久精品少妇AV| 久久综合亚洲鲁鲁五月天| 久久涩综合| 亚洲午夜精品久久久久久app| 久久九九久精品国产| 丁香久久婷婷国产午夜视频| 久久精品国产一区| 99久久精品国产综合一区|