[] OJの中置式の評価

Postfixの発現レビュー:https://blog.csdn.net/ssjhust123/article/details/8001651

タイトル内容:

統合「中置ターン接尾辞」と「接尾辞の評価」(非単純配列コール)を持つ2つの演算機能により、

中置式の直接の評価、新しいアルゴリズムまたは右中置式に左からスキャンし、

しかし、2つのスタック、一時的なオペレータ、一時記憶オペランドの使用が評価されます。

(サポート+ - 操作の* / ^ 5種類)

 

入力フォーマット:

文字列の合計1行、すなわち、インフィックス式、

前記各インター符号または記号は、スペースで区切られました。

 

出力フォーマット:

1行の整数、すなわち、評価した結果です。

 

サンプル入力:

(2 + 3)* 6 + 4月2日

 

出力例:

32

注意:

1.デジタル文字を接続します

2.pow介してDEVに(INT、INT)が、正しいフォーマットPOW(int型、ダブル)

  1の#include <iostreamの>
   2の#include <積層>
   3の#include <キュー>
   4の#include <cmath>
   5  使って 名前空間STD。
  6  ボイド POP1(スタック< CHAR >・X、キュー< チャー >&Y){
   7      一方!(x.empty()&&(x.top()== ' + ' || x.top()== ' - ' || x.top()== ' * ' || x.top()== ' / ' || x.top()== ' ^ "         y.push(x.top())。
  9          x.pop()。
10      }
 11  }
 12  空隙 POP2(スタック< CHAR >・X、キュー< チャー >&Y){
 13      ながら(!x.empty()&&(x.top()== ' * ' || x.top() == ' / ' || x.top()== ' ^ ' )){
 14          y.push(x.top())。
15          x.pop()。
16      }
 17  }
 18  ボイドのPOP3(スタック< CHAR >・X、キュー<>&Y){
 19      ながら(x.top()!= ' ' ){
 20          y.push(x.top());
 21          x.pop();
 22      }
 23      x.pop();
 24  }
 25  ボイド POP4(スタック< CHAR >・X、キュー< チャー >&Y){
 26      ながら(!x.empty()&& x.top()== ' ^ ' ){
 27          y.push(x.top() );
 28          x.pop();
 29      }
 30  }
 31  INTメイン(){
 32      チャーインフィックス[ 100 ]。
33      CHAR ;
34      int型B、C。
35      INTの記号= 0 36      スタック< チャー > my_symbol。
37      キュー< チャー > my_suffix。
38      スタック< 整数 > my_cal。
39      cin.getline(中置、100 )。
40      のためにint型 I = 0 ; iが< 100 ; ++ i)が{
 41         = インフィックス[I]。
42          であれば(== '  ' ){
 43              符号= 0 44              続け;
45          }
 46          であれば(A == ' \ 0 ' 47              ブレーク48          であれば' 0 ' <= A && <= ' 9 ' ){
 49              my_suffix.push(A)。
50              場合(!=署名0 51                  (my_suffix.pushを' @ ' );
52              記号++ ;
53              続け;
54          }
 55          スイッチ(A){
 56              ケース ' ':my_symbol.push(A); 破る;
 57              ケース ' + ' 58              ケース ' - ':POP1(my_symbol、my_suffix); my_symbol.push(a)は、休憩を; 
 59              の場合 ' * ' 60              ケース ' / ':POP2(my_symbol、my_suffix)。my_symbol.push(A)。破ります;
61              ケース ' ' ] POP3(my_symbol、my_suffix)。破ります; 
62              ケース ' ^ ':POP4(my_symbol、my_suffix)。my_symbol.push(A)。破ります;
63          }
 64          サイン= 0 65      }
 66      ながら(!my_symbol.empty()){
 67          my_suffix.push(my_symbol.top())。
68          my_symbol.pop()。
69      }
 70      (!my_suffix.empty()){
 71          、A = my_suffix.front()。
72          my_suffix.pop()。
73          であれば' 0 ' <= A && <= ' 9 ' ){
 74              my_cal.push( - ' 0 ' )。
75              続け;
76          }
 77          B = my_cal.top()。
78          my_cal.pop()。
79          C = my_cal.top()。
80          my_cal.pop()。
81          スイッチ(A){
 82             ケース ' + ' 83                  my_cal.push(C + B)。
84                  ブレーク;
85              ケース ' - ' 86                  my_cal.push(C - B)。
87                  ブレーク;
88              ケース ' * ' 89                  my_cal.push(C *とのB)。
90                  ブレーク;
91              ケース ' / ' 92                  my_cal.push(C / B)。
93                  ブレーク;
94              ケース ' @ ' 95                  my_cal.push(のC * 10 + B)。
96                  ブレーク;
97              ケース ' ^ ' 98                  my_cal.push(POW(C、(二重)b)参照)。
99                  ブレーク;
100          }
 101      }
 102      COUT << my_cal.top()<< ENDL。
103      リターン 0 ;
104 }

 

おすすめ

転載: www.cnblogs.com/victorique-de-blois/p/11655914.html