• <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 閱讀(722) 評論(0)  編輯 收藏 引用 所屬分類: HDU題解

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統計

            常用鏈接

            留言簿

            文章分類

            文章檔案

            搜索

            最新評論

            亚洲综合久久综合激情久久 | 久久九九久精品国产免费直播| 99久久综合狠狠综合久久止| 久久久久亚洲爆乳少妇无| 久久久无码精品亚洲日韩京东传媒 | 久久伊人精品一区二区三区| 久久人爽人人爽人人片AV| 精品国产婷婷久久久| 欧洲人妻丰满av无码久久不卡| 国产成人久久精品麻豆一区| 久久精品国产99国产精品导航| 91精品无码久久久久久五月天 | 久久久久国产精品麻豆AR影院| 日本强好片久久久久久AAA| 久久天天躁狠狠躁夜夜2020老熟妇| 国产精品久久久福利| 久久久一本精品99久久精品88| 久久久久国产| 久久久久国产一级毛片高清板| 九九99精品久久久久久| 人妻丰满AV无码久久不卡| 久久九九久精品国产免费直播| 久久久久亚洲AV成人网人人网站| 精品蜜臀久久久久99网站| 久久精品亚洲中文字幕无码麻豆| 伊人热热久久原色播放www| 亚洲欧美国产日韩综合久久| 欧洲性大片xxxxx久久久| 久久久久国色AV免费看图片| 久久成人国产精品一区二区| 国产午夜精品久久久久九九| 99久久精品无码一区二区毛片| 好久久免费视频高清| 久久96国产精品久久久| 66精品综合久久久久久久| 免费观看成人久久网免费观看| 99久久www免费人成精品| 国产一区二区精品久久岳| 久久中文精品无码中文字幕| 久久久久这里只有精品| 日本五月天婷久久网站|