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

Postfix式を評価する


数式を解くには、接頭辞または接尾辞の形式が必要です。中置を後置に変換した後、正しい答えを見つけるために後置評価アルゴリズムが必要です。

ここでも、スタックデータ構造を使用して接尾辞式を解決する必要があります。

後置式から、いくつかのオペランドが見つかった場合、それらをスタックにプッシュします。演算子が見つかると、スタックから2つのアイテムがポップされ、操作は正しい順序で実行されます。その後、結果は将来の使用のためにスタックにもプッシュされます。式全体が完成すると、最終結果もスタックトップに保存されます。

入力と出力

Input:
Postfix expression: 53+62/*35*+
Output:
The result is: 39

アルゴリズム

postfixEvaluation(postfix)

入力: 評価する接尾辞式。

出力: 接尾辞フォームを評価した後に回答してください。

Begin
   for each character ch in the postfix expression, do
      if ch is an operator ⨀ , then
         a := pop first element from stack
         b := pop second element from the stack
         res := b ⨀ a
         push res into the stack
      else if ch is an operand, then
         add ch into the stack
   done
   return element of stack top
End

#include<iostream>
#include<cmath>
#include<stack>
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 = "53+62/*35*+";
   cout << "The result is: "<<postfixEval(post);
}

出力

The result is: 39

  1. Pythonを使用して式ツリーを構築および評価するプログラム

    式ツリーのポストオーダートラバーサルが与えられたとします。与えられたポストオーダートラバーサルから式ツリーを構築してから、式を評価する必要があります。式ツリーのルートとツリーの評価値を返します。 したがって、入力が次のような場合 その場合、出力は-7になります。 ツリーの入力として指定された接尾辞の順序は、[1、 2、+、 3、 4、+、*]です。評価すると、式は(1 – 2)*(3 + 4);になります。これは-7に相当します。 これを解決するには、次の手順に従います- 左=0右=1 関数evaluate()を定義します。これが定着します ルートの値が数値の場

  2. Pythonで文字列を評価し、オブジェクトを返すにはどうすればよいですか?

    組み込みのeval()関数には文字列引数が必要です。ただし、Pythonインタープリターは、文字列をPython式として扱い、それが有効かどうかを評価してから、式の結果である型オブジェクトを返します。 算術式を含む文字列 >>> x=eval('2+2') >>> type(x) <class 'int'> >>> x 4 リスト/タプルに評価する文字列 >>> x=eval('tuple([1,2,3])') >>> x (1, 2, 3)