C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で後置記法を評価するプログラム


接尾辞式があり、値を評価する必要があるとします。後置式は、逆ポーランド記法とも呼ばれます。ここでは、スタックデータ構造を使用して接尾辞式を解決する必要があります。

したがって、式が「21 + 3 *」の場合、答えは9になります。

手順を見てみましょう-

  • 後置式の文字chごとに、
      を実行します。
    • chが演算子$\odot $の場合、
      • a:=スタックから最初の要素をポップします
      • b:=スタックから2番目の要素をポップします
      • res:=b $ \ odot $ a
      • 解像度をスタックにプッシュします
    • それ以外の場合、chがオペランドの場合、
      • スタックにchを追加
  • スタックトップの要素を返す

理解を深めるために、次の実装を見てみましょう-

#include<bits/stdc++.h>
using namespace std;
float scanNum(char ch){
   int value;
   value = ch;
   return float(value-'0');//return float from character
}
int isOperator(char ch){
   if(ch == '+'|| ch == '-'|| ch == '*'|| ch == '/' || ch == '^')
      return 1;//character is an operator
      return -1;//not an operator
   }
   int isOperand(char ch){
      if(ch >= '0' && ch <= '9')
         return 1;//character is an operand
      return -1;//not an operand
   }
   float operation(int a, int b, char op){
      //Perform operation
      if(op == '+')
         return b+a;
      else if(op == '-')
         return b-a;
      else if(op == '*')
         return b*a;
      else if(op == '/')
         return b/a;
      else if(op == '^')
         return pow(b,a); //find b^a
      else
   return INT_MIN; //return negative infinity
}
float postfixEval(string postfix){
   int a, b;
   stack<float> stk;
   string::iterator it;
   for(it=postfix.begin(); it!=postfix.end(); it++){
      //read elements and perform postfix evaluation
      if(isOperator(*it) != -1){
         a = stk.top();
         stk.pop();
         b = stk.top();
         stk.pop();
         stk.push(operation(a, b, *it));
      }else if(isOperand(*it) > 0){
         stk.push(scanNum(*it));
      }
   }
   return stk.top();
}
main(){
   string post = "21+3*";
   cout <<postfixEval(post);
}

入力

"21+3*"

出力

9

  1. C ++プログラムでの二分探索?

    二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要

  2. C++で三項式を評価するプログラム

    三項式を保持する式があるとすると、式の結果を評価する必要があります。 TrueとFalseのTとF、および「?」などのいくつかの値をサポートします。および「:」文字。いくつかのプロパティがあります: 指定された文字列の長さは10000以下である必要があります。 条件式は右から左にグループ化します。 条件は常にTまたはFのいずれかになります。したがって、条件が数字になることはありません。 式の結果は常にTまたはFに評価されます。 たとえば、入力が「T? T? F:T:T」なので、出力はFになります。 これを解決するには、次の手順に従います。 ret:=空の文字列、n:=sのサイズ、