UVa 327 – Evaluating Simple C Expressions

來源:互聯網
上載者:User

327 - Evaluating Simple C Expressions 3763 30.56% 1145 70.66%

題目連結:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=263


題目類型: 資料結構, 二叉樹



範例輸入:
a + bb - za+b--+c++c+f--+--a   f-- + c-- + d-++e
範例輸出:
Expression: a + b    value = 3    a = 1    b = 2Expression: b - z


題目大意: 給一個運算式, 運算式的變數由26個小寫字母組成,這26個字母按順序的初始值分為為1,2,3,……26,並且運算式中一個變數不會重複出現。 操作符由+, -, ++, -- (自增和自減有首碼和尾碼)。 然後輸出這個運算式的值,和每個出現的變數計算之後的值
解題思路:因為是資料結構專題, 最開始的時候自然想到的是建樹的方法來做。 想好方法之後, 開始敲代碼。 等到把建樹的代碼敲完後, 並且準備計算結果時, 發現其實這一題並不需要建樹也完全可以,而且更加簡單。不管是什麼方法, 解題的基本思路是, 先把運算式的首碼尾碼++, --處理掉, 那後從左至右計算就結果就行了。
下面是非建樹版的代碼:

#include<iostream>#include<cstdio>#include<cctype>#include<cstring>#include<deque>#include<vector>#include<algorithm>using namespace std;vector<char>var;deque<int>que;const int MAXN = 120;char str[MAXN];int val[26]; // 用來儲存a,b,……z的初始值int increment;// 對輸入的字串進行過濾,消去空格void Filter(){    int pos=0;    for(int i=0; i<strlen(str); ++i){        if(str[i] != ' '){            str[pos++] = str[i];        }    }    str[pos] = 0; // 字串結束標誌'\0'}// 是否有首碼inline bool havePrefix(int i){    if(str[i-1]=='+'&&str[i-2]=='+' || str[i-1]=='-'&&str[i-2]=='-')        return true;    return false;}// 是否有尾碼inline bool haveSuffix(int i){    if(str[i+1]=='+'&&str[i+2]=='+' || str[i+1]=='-'&&str[i+2]=='-')        return true;    return false;}void PreProsess(){    increment = 0;    while(!que.empty()) que.pop_back();    var.clear();    for(int i=0; i<strlen(str); ++i){        if(str[i]>='a' && str[i]<='z'){            // 有首碼            var.push_back(str[i]);  // 把該字母存入            if(i>=2 && havePrefix(i)){                if(str[i-1]=='+')                    ++val[str[i]-'a'];                else                    --val[str[i]-'a'];                int n = val[str[i]-'a'];                que.push_back(n);                str[i-1]=str[i-2] = ' ';             }             // 有尾碼            else if(i<=strlen(str)-3 && haveSuffix(i)){                      int n = val[str[i]-'a'];                que.push_back(n);                if(str[i+1]=='+'){                    ++val[str[i]-'a'];                    --increment;                }                else{                    --val[str[i]-'a'];                    ++increment;                }                str[i+1] = str[i+2] = ' ';            }            else {                int n = val[str[i]-'a'];                que.push_back(n);            }        }    }}int GetSum(){    for(int i=0; i<strlen(str); ++i){        if(str[i]=='+' || str[i]=='-'){            int a=que.front();            que.pop_front();            int b=que.front();            que.pop_front();            if(str[i]=='+')                que.push_front(a+b);            else                que.push_front(a-b);        }    }    return que.front();}void Solve(){    // 給a,b,c……z 初始值    for(int i=0; i<26; ++i){        val[i] = i+1;    }        Filter();    PreProsess();    int sum = GetSum();  //  puts(str);    printf("    value = %d\n", sum);    sort(var.begin(), var.begin()+var.size());    for(int i=0; i<var.size(); ++i){        printf("    %c = %d\n",var[i], val[var[i]-'a']);    } //   printf("\n");}int main(){    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);    while(gets(str)){        printf("Expression: %s\n", str);        Solve();    }    return 0;}

——      生命的意義,在於賦予它意義。 

                   原創  http://blog.csdn.net/shuangde800  , By
  D_Double








相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.