• <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>

            hdu3596(逆波蘭表達式求值)

            /*************************************/
            /*支持數字(而非表達式)前面有正負號   */
            /*支持浮點數的+,-,*,/,^ 運算      */
            /*************************************/
            #include <stdio.h>
            #include <memory>
            #include <iostream>
            #include <algorithm>
            #include <cstring>
            #include <vector>
            #include <map>
            #include <cmath>
            #include <set>
            #include <queue>
            #include <time.h>
            #include <limits>
            #include <stack>
            using namespace std;
            #define N 10005
            #define eps 1e-9
            #define vType double
            struct node{
             vType val;
             char op;
             node(vType _val=0, char _op = ' '):val(_val), op(_op){}
            }nodes[N];
            char str[N];
            inline bool isDigit(char ch){
             return ch >= '0' && ch <= '9';
            }
            map<char, int> ms;
            void init(){
             ms['('] = 0;
             ms['-'] = ms['+'] = 1;
             ms['*'] = ms['/'] = 2;
             ms['^'] = 3;
            }
            vType calPoland(node* nodes, int k){
             int i, j;
             vType a, b;
             stack<vType> s;
             for(i = 0; i < k; i++){
              if(nodes[i].op == ' '){
               s.push(nodes[i].val);
              }else{
               a = s.top();
               s.pop();
               b = s.top();
               s.pop();
               switch(nodes[i].op){
                case '+':
                 s.push(b + a);
                 break;
                case '-':
                 s.push(b - a);
                 break;
                case '*':
                 s.push(b * a);
                 break;
                case '/':
                 if(fabs(a) < eps) throw true;
                 s.push(b / a);
                 break;
                case '^':
                 s.push(pow(b, a));
                 break;
               }
              }
             }
             return s.top();
            }
            vType poland(char* str){
             int i, k, sign;
             bool inNum, hasDot;  //inNum標記當前是否可以輸入數字, hasDot標記是否已經輸入小數點
             stack<char> oper;
             for(i = k = 0, sign = 1, inNum = true; str[i]; i++){
              if(isDigit(str[i]) || str[i] == '.'){
               if(inNum){
                vType val;
                double w = 1;
                if(str[i] == '.'){
                 hasDot = true;
                 val = 0;
                }
                else{
                 val = str[i] - '0';
                 hasDot = false;
                }
                i++;
                while(isDigit(str[i]) || str[i] == '.'){
                 if(str[i] == '.'){
                  if(hasDot) throw true;
                  hasDot = true;
                 }else{
                  if(hasDot){
                   w *= 0.1;
                   val += (str[i] - '0') * w;
                  }
                  else val = val * 10 + str[i] - '0';
                 }
                 i++;
                }
                i--;
                nodes[k++] = node(val * sign, ' ');
                sign = 1;
                inNum = false;
               }else throw true;
              }else{
               switch(str[i]){
                case '(':
                 oper.push(str[i]);
                 break;
                case ')':
                 while(!oper.empty() && oper.top() != '('){
                  nodes[k++] = node(0, oper.top());
                  oper.pop();
                 }
                 if(oper.empty()) throw true;  //沒有與')'匹配的'('
                 oper.pop();
                 break;
                case '+':
                case '-':
                case '*':
                case '/':
                case '^':
                 if(inNum){
                  if(str[i] != '+' && str[i] != '-') throw true;
                  while(str[i] == '+' || str[i] == '-'){
                   if(str[i] == '-') sign *= -1;
                   i++;
                  }
                  i--;
                 }else{
                  //while(!oper.empty() && ((str[i] != '^' && ms[str[i]] <= ms[oper.top()]) ||
                  // ((str[i] == '^' && ms[str[i]] < ms[oper.top()])))){ //如果^是右結合的話就用這個
                  while(!oper.empty() && ms[str[i]] <= ms[oper.top()]){
                    nodes[k++] = node(0, oper.top());
                    oper.pop();
                  }
                  oper.push(str[i]);
                  inNum = true;
                 }
                 break;
               }
              }
             }
             while(!oper.empty()){
              nodes[k++] = node(0, oper.top());
              oper.pop();
             }
             return calPoland(nodes, k);
            }
            void Cal(char* str){
             try{
              vType ans = poland(str);
              printf("%.8lf\n", ans);
             }
             catch(bool){
              printf("The teacher is so lazy!\n");
             }
            }
            int main(){
            #ifndef ONLINE_JUDGE
             //freopen("in.txt", "r", stdin);
             //freopen("out.txt", "w", stdout);
            #endif
             init();
             while(~scanf("%s", str)) Cal(str);
             return 0;
            }

            posted on 2011-01-16 19:58 tw 閱讀(715) 評論(0)  編輯 收藏 引用 所屬分類: HDU題解

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導航

            統計

            常用鏈接

            留言簿

            文章分類

            文章檔案

            搜索

            最新評論

            久久精品人妻一区二区三区| 久久有码中文字幕| 久久AV高清无码| 亚洲国产成人久久综合碰| 国产精品久久波多野结衣| 久久久久这里只有精品| 97精品依人久久久大香线蕉97| 精品久久久久久国产91| 久久久久久国产精品无码下载 | 欧美黑人又粗又大久久久| 狠狠狠色丁香婷婷综合久久俺| 久久精品一本到99热免费| 国产成人精品久久亚洲| 日韩av无码久久精品免费| 四虎国产精品免费久久久| 久久精品国产亚洲αv忘忧草| 麻豆精品久久久一区二区| 欧美va久久久噜噜噜久久| 人妻丰满?V无码久久不卡| 亚洲国产成人精品91久久久 | 青青青国产成人久久111网站| 欧美亚洲日本久久精品| 国产91色综合久久免费| 久久亚洲春色中文字幕久久久| 99999久久久久久亚洲| 久久国产精品国产自线拍免费| 亚洲成色WWW久久网站| 久久AV高清无码| 久久www免费人成看国产片| 国产亚洲美女精品久久久2020| 思思久久99热只有频精品66| 色播久久人人爽人人爽人人片AV| 久久午夜免费视频| 88久久精品无码一区二区毛片| 国产免费久久久久久无码| 99精品国产免费久久久久久下载| 久久青青草原亚洲av无码app | 久久午夜无码鲁丝片秋霞| 午夜精品久久久久久久久| 97超级碰碰碰久久久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 |