• <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
            今天刷刷我們學校的OJ。看到了那道我們大家都熟悉的表達式求值題目。去網上搜了下,發現沒有現成可用的好的算法。于是自己花了點時間寫了個。沒有做過多優化,先發出來再說。
              1#include<stdio.h>
              2#include<string.h>
              3#include<stack>
              4using namespace std;
              5
              6char exp[1100];
              7char num[100];//此數組用來把字符數字轉化為整數
              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運算符比b優先。如果是的話,那么返回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//這個函數用來判斷字符是數字還是運算符
             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//事實證明,在沒有括號的情況下,應該從前往后進行計算
            115void inKuohao()
            116{
            117    char c = cstack.top();
            118    stack<char> ccstack;
            119    stack<double> nnstack;
            120    //把括號內的表達式逆過來
            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]))//如果上一個是數字的話,就入棧.這個判斷是為了防止出現(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 崔佳星 閱讀(281) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構和算法
            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            尹人香蕉久久99天天拍| 7国产欧美日韩综合天堂中文久久久久| 久久综合给合久久狠狠狠97色 | 久久无码一区二区三区少妇| 精品久久久无码人妻中文字幕豆芽| 亚洲欧美另类日本久久国产真实乱对白| 久久精品国产精品国产精品污| 久久久婷婷五月亚洲97号色| 久久狠狠爱亚洲综合影院| 久久久久99这里有精品10| 香蕉久久夜色精品国产尤物| 无码人妻少妇久久中文字幕| 久久亚洲熟女cc98cm| 久久精品国产99久久久古代| 亚洲狠狠婷婷综合久久蜜芽| 亚洲AV成人无码久久精品老人| 久久精品aⅴ无码中文字字幕不卡| 久久午夜福利无码1000合集| 久久久www免费人成精品| 色欲综合久久躁天天躁蜜桃| 色综合久久无码中文字幕| 俺来也俺去啦久久综合网| www久久久天天com| 久久e热在这里只有国产中文精品99| 国产成人精品久久| 国产一区二区久久久| 国产精品国色综合久久| 曰曰摸天天摸人人看久久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久99久久99小草精品免视看| 久久精品九九亚洲精品天堂| 久久久久人妻一区精品果冻| 久久精品国产99久久久古代| 久久综合综合久久97色| 综合久久一区二区三区 | 精品久久亚洲中文无码| 精品精品国产自在久久高清| 天天做夜夜做久久做狠狠| 国产精品无码久久综合| 亚洲国产成人久久精品99| 久久婷婷五月综合97色一本一本 |