Board logo

標題: 2011 1001 (中序轉後序 ) [打印本頁]

作者: buy    時間: 2011-10-1 20:31     標題: 2011 1001 (中序轉後序 )

  1. // Test.cpp : 定義主控台應用程式的進入點。
  2. //

  3. #include "stdafx.h"      // 不要管
  4. #include<iostream>
  5. #include<sstream>
  6. using namespace std;

  7. //宣告一個資料型態叫做Stack
  8. class StackChar{
  9.         private:
  10.                 int top;  //紀錄目前index位置
  11.         public:
  12.                 char stack[1000];  //放資料的地方

  13.                 StackChar()
  14.                 {
  15.                         top = -1;   // 沒有東西
  16.                 };

  17.                 void push(char input)
  18.                 {
  19.                         stack[++top] = input;
  20.                 };

  21.                 char pop()
  22.                 {
  23.                         return stack[top--];
  24.                 };

  25.                 char peak()
  26.                 {
  27.                         return stack[top];
  28.                 };

  29.                 bool IsEmpty()
  30.                 {
  31.                         return (top <= -1)? true : false;
  32.                 }
  33. };

  34. //宣告一個資料型態叫做Stack
  35. class StackInteger{
  36.         private:
  37.                 int top;  //紀錄目前index位置
  38.         public:
  39.                 int stack[1000];  //放資料的地方

  40.                 StackInteger()
  41.                 {
  42.                         top = -1;   // 沒有東西
  43.                 };

  44.                 void push(int input)
  45.                 {
  46.                         stack[++top] = input;
  47.                 };

  48.                 int pop()
  49.                 {
  50.                         return stack[top--];
  51.                 };

  52.                 int peak()
  53.                 {
  54.                         return stack[top];
  55.                 };

  56.                 bool IsEmpty()
  57.                 {
  58.                         return (top <= -1)? true : false;
  59.                 }
  60. };


  61. int order(char op);   // 取得 算數優先權 */ > +-
  62. string infixToPostfix(string infix);   // 中序轉後序
  63. int pofixComput(string pofix);

  64. int _tmain(int argc, _TCHAR* argv[])    //int main()
  65. {
  66.         string input;
  67.         getline(cin, input);
  68.         //string postfix = infixToPostfix(input);

  69.         cout << endl << pofixComput(
  70.                  infixToPostfix(input)
  71.                 );


  72.         string str;
  73.         getline(cin, str);
  74.         return 0;
  75. }

  76. // 取得 算數優先權 */ > +-
  77. int order(char op)
  78. {
  79.         int returnValue = 0;
  80.         switch(op)
  81.         {
  82.                 case '*' :
  83.                 case '/' :
  84.                         returnValue = 2;
  85.                         break;
  86.                 case  '+':
  87.                 case  '-':
  88.                         returnValue = 1;
  89.                         break;
  90.                 default:
  91.                         returnValue = 0;
  92.                         break;
  93.         }
  94.         return returnValue;
  95. }

  96. // 中序轉後序
  97. string infixToPostfix(string infix)
  98. {
  99.         istringstream issstream(infix);  //輸入
  100.         ostringstream postfix;  //輸出
  101.         string word;  // 暫時儲存 temp

  102.         StackChar stack;
  103.         while(issstream >> word)
  104.         {
  105.                 if( isdigit(word[0]))
  106.                 {
  107.                         postfix << word << " ";
  108.                 }
  109.                 else
  110.                 {
  111.                         switch(word[0])
  112.                         {
  113.                                 case '(':
  114.                                         stack.push('(');
  115.                                         break;

  116.                                 case ')':
  117.                                         while(stack.peak() != '('  )
  118.                                         {
  119.                                                 postfix << stack.pop() << " ";
  120.                                         }
  121.                                         stack.pop();
  122.                                         break;

  123.                                 case '+':   case '-': case '*':   case '/':
  124.                                         if( stack.IsEmpty())   //如果Stack沒資料
  125.                                         {
  126.                                                 stack.push(word[0]);
  127.                                         }
  128.                                         else  //如果Stack至少有一個資料
  129.                                         {
  130.                                                 if( order(word[0]  ) > order( stack.peak() ) )
  131.                                                 {
  132.                                                         stack.push(word[0]);
  133.                                                 }
  134.                                                 else
  135.                                                 {
  136.                                                         do{
  137.                                                                 postfix << stack.pop() << " ";
  138.                                                         }while //如果還有資料 且 優先權小於等於目前的word[0],繼續pop()
  139.                                                                 ( !stack.IsEmpty() &&  
  140.                                                                    order(word[0]) <= order( stack.peak() )
  141.                                                                 );
  142.                                                         stack.push(word[0]);
  143.                                                 }
  144.                                         }
  145.                                         break;

  146.                                 default:
  147.                                         break;
  148.                         }
  149.                 }
  150.         }

  151.         //清空stack
  152.         if(stack.IsEmpty()  ) //如果沒資料
  153.         {
  154.                 ;
  155.         }
  156.         else
  157.         {
  158.                 do{
  159.                         postfix << stack.pop() << " ";
  160.                 }while(  !stack.IsEmpty() );
  161.         }
  162.         return postfix.str();
  163. }

  164. // 後序 計算
  165. int pofixComput(string pofix)
  166. {
  167.         istringstream issstream(pofix);  //輸入
  168.         string word;
  169.         StackInteger stackInt;

  170.                         int i , j ;
  171.         while( issstream >>word  )
  172.         {
  173.                 if(isdigit(word[0])) //如果是數字
  174.         {
  175.                         stackInt.push(  
  176.                                          atoi(word.c_str())
  177.                                 );
  178.                 }
  179.                 else   // 如果不是數字
  180.                 {
  181.                         i = stackInt.pop();
  182.                         j = stackInt.pop();
  183.                         switch(word[0])
  184.                         {
  185.                                  case '+':   
  186.                                          stackInt.push(j + i);
  187.                                          break;
  188.                                  case '-':
  189.                                          stackInt.push(j - i);
  190.                                          break;
  191.                                  case '*':   
  192.                                          stackInt.push(j * i);
  193.                                          break;
  194.                                  case '/':
  195.                                          stackInt.push(j / i);
  196.                                          break;
  197.                                  default:
  198.                                          break;
  199.                         }
  200.                 }
  201.         }  // End While

  202.         return stackInt.pop();
  203. }
複製代碼





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