UVa 327:Evaluating Simple C Expressions

來源:互聯網
上載者:User

題目連結:

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,並且運算式中一個變數不會重複出現。 操作符由+, -, ++, -- (自增和自減有首碼和尾碼)。

然後輸出這個運算式的值,和每個出現的變數計算之後的值

解題思路:

因為是資料結構專題, 最開始的時候自然想到的是建樹的方法來做。

本文URL地址:http://www.bianceng.cn/Programming/sjjg/201410/45529.htm

想好方法之後, 開始敲代碼。 等到把建樹的代碼敲完後, 並且準備計算結果時, 發現其實這一題並不需要建樹也完全可以,而且更加簡單。

不管是什麼方法, 解題的基本思路是, 先把運算式的首碼尾碼++, --處理掉, 那後從左至右計算就結果就行了。

下面是非建樹版的代碼:

#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;  }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.