Board logo

標題: 2011 08 27 四則運算 ( 可含括號 ) [打印本頁]

作者: buy    時間: 2011-8-27 10:48     標題: 2011 08 27 四則運算 ( 可含括號 )

目前四則運算可以使用括號

[attach]415[/attach]

請考慮 5+((123)+456)*23-345 為何會出錯

& 如何實作五則運算
作者: buy    時間: 2011-8-27 10:50

http://zerojudge.tw/ShowProblem?problemid=a017   解答
  1. #include<iostream>
  2. #include<sstream>
  3. using namespace std;

  4. int order(char op);
  5. string infixToPofix(string infix);
  6. int pofixComput(string pofix);

  7. int main()
  8. {
  9.     string input;
  10.   
  11.     while(getline(cin, input))
  12.     {
  13.         string pofix = infixToPofix(input);//中序式轉後序式
  14.         cout << pofixComput(pofix) << endl;//後序式運算
  15.     }
  16. }

  17. int order(char op)
  18. {
  19.     switch(op)
  20.     {
  21.         case'(' :
  22.             return -1;
  23.             break;
  24.         case '+' :
  25.         case '-' :
  26.             return 0;
  27.             break;
  28.         default :// * / %
  29.             return 1;
  30.     }
  31. }

  32. string infixToPofix(string infix)
  33. {
  34.     istringstream isstream(infix);
  35.     ostringstream pofix;
  36.     string word;
  37.     char opStack[1000];
  38.     int top_Op = 0;
  39.     while(isstream >> word)
  40.     {                     
  41.         if(isdigit(word[0]))
  42.         {
  43.             pofix << word << " ";//數字直接輸出
  44.         }
  45.         else//運算子
  46.         {
  47.             switch(word[0])
  48.             {
  49.                 case '(' : //左括弧直接進入堆疊
  50.                     opStack[top_Op++] = word[0];
  51.                     break;
  52.                     
  53.                 case ')' : //右括弧 ,輸出至左括弧停止
  54.                     while(opStack[top_Op-1]!='(')//一個左括弧搭配一個又括弧,top_Op-1必大於-1
  55.                     {
  56.                         pofix << opStack[--top_Op] << " ";
  57.                     }
  58.                     top_Op--;//左括弧不輸出  略過
  59.                     break;
  60.                     
  61.                 case '+' : case'-' : case '*' : case '/' : case '%'://加減乘除餘
  62.                     if(top_Op-1>=0)//避免超出陣列範圍
  63.                         while(order(opStack[top_Op-1]) >= order(word[0])&&top_Op-1>=0)
  64.                         {//持續輸出  堆疊中比自己優先的運算子
  65.                             pofix << opStack[--top_Op] << " ";
  66.                                 //cout << "輸出" << opStack[top_Op] << "top:" << top_Op;
  67.                         }
  68.                         //放入堆疊
  69.                         //cout << "放入堆疊";
  70.                     opStack[top_Op++] = word[0];
  71.                     break;
  72.                     
  73.                     default :
  74.                         break;
  75.             }
  76.         }
  77.                     
  78.     }
  79.         //讀完全部  全部輸出直到堆疊為空
  80.        // cout << "輸出至空" ;
  81.     while(top_Op-1>=0)
  82.     {
  83.         pofix << opStack[--top_Op] << " ";
  84.         //cout << "輸出" << opStack[top_Op];            
  85.     }

  86.     return pofix.str();   
  87. }

  88. int pofixComput(string pofix)
  89. {
  90.     int stack[1000];
  91.     int top = 0;
  92.     istringstream read(pofix);
  93.     string word;
  94.     while(read >> word)
  95.     {
  96.         if(isdigit(word[0]))
  97.         {
  98.             stack[top++] = atoi(word.c_str());
  99.         }
  100.         else
  101.         {
  102.             switch(word[0])
  103.             {
  104.                 case '+' :
  105.                     stack[top-2] = stack[top-2] + stack[top-1];
  106.                     top -= 1;
  107.                     break;
  108.                 case '-' :
  109.                     stack[top-2] = stack[top-2] - stack[top-1];
  110.                     top -= 1;
  111.                     break;
  112.                 case '*' :
  113.                     stack[top-2] = stack[top-2] * stack[top-1];
  114.                     top -= 1;
  115.                     break;
  116.                 case '/' :
  117.                     stack[top-2] = stack[top-2] / stack[top-1];
  118.                     top -= 1;
  119.                     break;
  120.                 case '%' :
  121.                     stack[top-2] = stack[top-2] % stack[top-1];
  122.                     top -= 1;
  123.                     break;
  124.             }
  125.         }
  126.     }
  127.     return stack[0];
  128. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2