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

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿

            文章分類

            文章檔案

            搜索

            最新評論

            日批日出水久久亚洲精品tv| 久久精品国产亚洲AV麻豆网站| 亚洲一区中文字幕久久| 国产韩国精品一区二区三区久久| 国产成人无码精品久久久久免费 | 国产香蕉久久精品综合网| 色偷偷久久一区二区三区| 亚洲狠狠久久综合一区77777| 亚洲&#228;v永久无码精品天堂久久 | 国产69精品久久久久99尤物| 久久夜色精品国产www| 久久综合香蕉国产蜜臀AV| 国产高清国内精品福利99久久| 国产精品久久久久免费a∨| 亚洲国产成人久久精品影视| 性做久久久久久久| 无码任你躁久久久久久老妇| 精品免费tv久久久久久久| 久久99热这里只有精品国产| 国内精品欧美久久精品| 久久91精品国产91久久麻豆| 97精品依人久久久大香线蕉97 | 久久天天躁狠狠躁夜夜avapp| 久久免费美女视频| 久久精品蜜芽亚洲国产AV| 国产欧美久久久精品影院| 久久这里只有精品视频99| 国产69精品久久久久99| 久久久国产精品福利免费| 久久Av无码精品人妻系列| 亚洲综合熟女久久久30p| 日韩久久久久中文字幕人妻 | 一级a性色生活片久久无| 久久不见久久见免费影院www日本| 国产精品久久久久久吹潮| 国产精品美女久久久m| 72种姿势欧美久久久久大黄蕉| 久久精品国产亚洲AV无码娇色| 久久99国产综合精品| 韩国三级大全久久网站| 精品久久久久久久久午夜福利|