スタック実装式の評価


スタック実装式の評価-逆ポーランド法
データ構造をまともに勉強して1ヶ月以上経ち、基本的な線形テーブルとvector、list、dequeなどが浅く接触しました.実験は学生情報管理の順序表実現とチェーン表実現を行い,両者にはそれぞれメリットとデメリットがある.しかし、データ構造といくつかのアルゴリズムを学ぶことによって、私はそれらのすごい人物と彼らが書いた不思議なアルゴリズムにとても崇拝して、胸の中は熱くて、現実が私を破壊して軽挙妄動する勇気がありません.
これは、データ構造の制限されたテーブルであるスタックに接触したばかりではありません.スタックは先進的な後出(FILO)であり、この特性はこのデータ型に独特の個性を与えている.彼は一端からpush圧入とpopポップアップ操作しかできない.これはちょうど私が式を作って値を求める要求を記号しています.もちろん私は、学んだ以上、深いところを掘って、もっと深いところの人々が作った木と探求を見てみたいと思っています.
一般的に、コンピュータは、a+b*c+(d*e+f)*gのような式を処理し、演算子の優先度に従ってサブ式を前後して計算する必要がある.従って、接尾辞変換接尾辞法(逆ポーランド)を用いて、二義性がなく、順次処理可能な式に変換する.ソース:
 

  
  
  
  
  1. //2011-10-10 by bibodeng 
  2. //  
  3. // :  
  4. //  
  5. #include <iostream> 
  6. #include <stack> 
  7. #include <vector> 
  8. #include <string> 
  9. #include <sstream> 
  10. using namespace std; 
  11. typedef vector<string> STRVECTOR; 
  12. void show_vector( STRVECTOR &v); 
  13. double str2num(string s); 
  14. string num2str(double i); 
  15.  
  16. void main() 
  17.     // ,  
  18.     stack <string,vector<string>> st1 ; 
  19.     vector<string> input;// vector  
  20.     vector<string> temp;//  
  21.      
  22.     char ans; 
  23.     string a; 
  24. //******************************************** 
  25.     do 
  26.     { 
  27.         system("cls"); 
  28.         STRVECTOR::iterator ite; 
  29.         cout<<" "<<endl
  30.         int APPY_SIZE; 
  31.         cin>>APPY_SIZE; 
  32.          
  33.         cout<<" , :"<<endl
  34.         for( int i=0;i<APPY_SIZE;i++) 
  35.         { 
  36.             cin>>a; 
  37.             input.push_back(a); 
  38.         } 
  39.         cout<<" :"<<endl
  40.         show_vector(input); 
  41.  
  42.         //  0  ,1 , 2  ,  
  43.         int flag=0
  44.  
  45. //******************* ******************* 
  46. //*********************** ************************** 
  47.         for(unsigned int i=0;i<input.size();i++) 
  48.         { 
  49.             // input, , , temp 
  50.             // +   - 
  51.              
  52.  
  53.              // + - 
  54.                if("+"==input[i] || "-"==input[i]) 
  55.                 {               
  56.                     // , ( 
  57.                     while(!st1.empty()) 
  58.                     { 
  59.                         if(st1.top()=="(") 
  60.                             break; // (  , ),(  
  61.  
  62.                         temp.push_back(st1.top()); 
  63.                         st1.pop(); 
  64.                         //  
  65.                     } 
  66.                     // , +   -   
  67.                     st1.push(input[i]); 
  68.                 } 
  69. //************************ *************************** 
  70. // + - ,  
  71.  
  72.             else if("*"==input[i] || "/"==input[i]) 
  73.             {    
  74.                         if(!st1.empty())    //  
  75.                         { 
  76.                             //  
  77.                             if(st1.top()=="+"||st1.top()=="-") 
  78.                             st1.push(input[i]); 
  79.                              
  80.                             // ,  
  81.                             else if(st1.top()=="*"||st1.top()=="/") 
  82.                                 { 
  83.                                     while(!st1.empty()&&st1.top()!="(") 
  84.                                     { 
  85.                                         temp.push_back(st1.top()); 
  86.                                         st1.pop();//  
  87.                                     } 
  88.                                 }    
  89.                             else if(st1.top()=="(") 
  90.                                 st1.push(input[i]); 
  91.                         }    
  92.                         // ,  
  93.                             if (st1.empty()) 
  94.                                     st1.push(input[i]);      
  95.  
  96.                     } 
  97. //************************ **************************** 
  98.  
  99.                 // ,  
  100.                 else if(input[i]== "(") 
  101.                     { 
  102.                         st1.push(input[i]); 
  103.                         flag++;  // ,  
  104.                     } 
  105.               // , ,  
  106.                else if(input[i]== ")") 
  107.                     { 
  108.                         // (  
  109.                         if(!st1.empty()) 
  110.                         { 
  111.                             while(st1.top()!="(")//  
  112.                             { 
  113.                                 temp.push_back(st1.top()); 
  114.                                 st1.pop(); 
  115.                             } 
  116.                             if(st1.top()=="(") 
  117.                             { 
  118.                                 st1.pop();// flag 
  119.                                 flag--; 
  120.                             }                    
  121.                         } 
  122.                     } 
  123. //********************************* temp************************ 
  124.                 else if(input[i]!="+"&& input[i]!="-"&&input[i]!="*"&&input[i]!="/"&&input[i]!="("&&input[i]!=")") 
  125.                 temp.push_back(input[i]); 
  126. //************************ ************************* 
  127.         } 
  128.  
  129.  
  130.     // temp  
  131.     while(!st1.empty()) 
  132.         { 
  133.             temp.push_back(st1.top()); 
  134.             st1.pop(); 
  135.         } 
  136.  
  137.  
  138.     //  
  139.     show_vector(temp); 
  140. //********************************************************** 
  141.     // ,  
  142.     stack <string,vector<string>> final; 
  143.     double x=0,y=0; //x,y
  144.     double result=0; //result
  145.  
  146.         //  
  147.     for(unsigned int i=0;i<temp.size();i++) 
  148.         { 
  149.             //  
  150.             if(temp[i]!="+"&& temp[i]!="-"&&temp[i]!="*"&&temp[i]!="/"&&temp[i]!="("&&temp[i]!=")") 
  151.                 final.push(temp[i]);//  
  152.  
  153.             else // , ,  
  154.             { 
  155.                 if(!final.empty()) 
  156.                 { 
  157.                     x=str2num(final.top()); 
  158.                     final.pop(); 
  159.                     y=str2num(final.top()); 
  160.                     final.pop(); 
  161.                 } 
  162.  
  163.                     if(temp[i]== "+")result=x+y; 
  164.                     else if(temp[i]== "-")result=y-x; 
  165.                     else if(temp[i]== "*")result=x*y; 
  166.                     else if (temp[i]=="/")result=y/x; 
  167.                                          
  168.                     string temp1; 
  169.                     temp1=num2str(result); 
  170.                      
  171.                     final.push(temp1); 
  172.             } 
  173.  
  174.         } 
  175.     cout<<result<<endl
  176.          
  177. //******************************************************************** 
  178.         cout<<" (Y/n) "<<endl
  179.         cin>>ans; 
  180.         input.clear(); 
  181.         temp.clear(); 
  182.     }while(ans=='y'||ans=='Y'); 
  183. //******************************************** 
  184.  
  185.  
  186.  
  187.  
  188. // vector  
  189. void show_vector( STRVECTOR &v) 
  190.     STRVECTOR::iterator ite; 
  191.     for(ite=v.begin();ite!=v.end();ite++) 
  192.         cout<<*ite; 
  193.     cout<<endl
  194.  
  195. //  
  196. double str2num(string s) 
  197.  {   
  198.         double num; 
  199.         stringstream ss(s); 
  200.         ss>>num; 
  201.         return num; 
  202. //  
  203. string num2str(double i) 
  204.         stringstream ss; 
  205.         ss<<i
  206.         return ss.str(); 

最も重要なステップは、接尾辞を接尾辞に変換することです.4つのケースに分けて+-、優先度が最も低い場合は、st 1スタックの演算子を(またはst 1が空になるまでポップアップするだけです.*/などの優先度が高い場合は、いくつかのケースに分けられます.しかし、基本的には3つあります.
1、優先度が低い場合、直接押し込む
2、同じ優先順位のイジェクト後に押し込む
3、突き当たる(直接押し込む.
最後の2つのケース(「(」と「)」)が比較的扱いやすく、(優先度が最も高く、直接押し込まれます.)に遭遇すると、左かっこ「(」との間の演算子が結果にポップアップされ、最後に「(」がポップアップされ、結果には送られません.
コード化の際にかなりの問題が発生し,最後に各種バグを監視で清掃する.コンピュータの中のいくつかの微細な論理は確かに無視できない.すべての文は試練に耐えなければならない.
この式の評価は、コンパイラエンジニアリングの重要な構成部分であり、多くのシンボルバランスや、簡単なif elseなどの多くのマッチング問題に関連していることがわかります.コンパイラは文法の正しいアルゴリズム言語の意味を正確に機械言語に翻訳しなければならない.しかし、この中には、コンパイラの使用者として心配する必要はありませんが、周到な細部を考慮するのは難しい人がたくさんいます.しかし、私たちが使っているアルゴリズム言語の柔軟性から見ると、コンパイラを書く人にポットを飲ませるのに十分です.だから、私は巨大なコンパイラを書くことができる人を心から崇拝しています.stallmanのような天才型ハッカーは、その時になったら必ず彼が書いたgccの中の巧みな天工のコードを見てみなければならない.
最近、データ構造を学ぶことで、現実の多くのものをモデルに描いて実現することができると思います.そして、とても面白いものもあります.例えばスタックで迷路を歩き、循環チェーンテーブルでジョセフリングを解く.これらの問題はすべてとても面白くて、その上この中に良いアルゴリズムが少なくなくて、有名なknuthが書いたジョセフリングアルゴリズムのようで、かなり簡潔で、効率も高くて、普通の人が書いたアルゴリズムは大列で効率が低くて、不幸にも私自身も普通の人です.現実社会では、良いアルゴリズムは往々にして人を奮い立たせ、効率を倍増させることができる.特にこの情報が急速に発展している時代には、アルゴリズムはさらに重要だ.このような大きな演算量を考えてみると、アルゴリズムが良ければ、一度の処理でどれだけの時間と空間を節約したのか.今、アルゴリズムを正式にマスターした時代.
2011-10-11    by bibodeng