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

特定のプレフィックス式の式ツリーを構築するC++プログラム


式ツリーは基本的に、式を表すために使用される二分木です。式ツリーでは、内部ノードは演算子に対応し、各リーフノードはオペランドに対応します。これは、インオーダー、プレオーダー、ポストオーダートラバーサルでプレフィックス式の式ツリーを構築するC++プログラムです。

アルゴリズム

Begin
   class ExpressionTree which has following functions:
   function push() to push nodes into the tree:
   If stack is null
      then push the node as first element
   Else
      push the node and make it top
   
   function pop() to pop out nodes from the tree:
   If stack is null
      then print underflow
   Else
      Pop out the node and update top
   
   function insert() to insert characters:
   If it is digit
      then push it.
   Else if it is operator
      Then pop it.
   Else
      Print “invalid Expression”
     
   function postOrder() for postorder traversal:
   If tree is not empty
      postOrder(ptr->l)
      postOrder(ptr->r)
      Print root as ptr->d

   function inOrder() for inorder traversal:
   If tree is not empty
      inOrder(ptr->l)
      Print root as ptr->d
      inOrder(ptr->r)

   function preOrder() for preorder traversal:
   If tree is not empty
      Print root as ptr->d
      preOrder(ptr->l)
      preOrder(ptr->r)
End

サンプルコード

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;

class TreeN//node declaration {
   public: char d;
   TreeN *l, *r;
   TreeN(char d) {
      this->d = d;
      this->l = NULL;
      this->r = NULL;
   }
};

class StackNod// stack declaration {
   public: TreeN *treeN;
   StackNod *n;
   StackNod(TreeN*treeN)//constructor {
      this->treeN = treeN;
      n = NULL;
   }
};

class ExpressionTree {
   private: StackNod *top;
   public: ExpressionTree() {
      top = NULL;
   }
   void clear() {
      top = NULL;
   }

   void push(TreeN *ptr) {
      if (top == NULL)
         top = new StackNod(ptr);
      else {
         StackNod *nptr = new StackNod(ptr);
         nptr->n = top;
         top = nptr;
      }
   }

   TreeN *pop() {
      if (top == NULL) {
         cout<<"Underflow"<<endl;
      } else {
         TreeN *ptr = top->treeN;
         top = top->n;
         return ptr;
      }
   }

   TreeN *peek() {
      return top->treeN;
   }

   void insert(char val) {
      if (isDigit(val)) {
         TreeN *nptr = new TreeN(val);
         push(nptr);
      } else if (isOperator(val)) {
         TreeN *nptr = new TreeN(val);
         nptr->l = pop();
         nptr->r= pop();
         push(nptr);
      } else {
         cout<<"Invalid Expression"<<endl;
         return;
      }
   }

   bool isDigit(char ch) {
      return ch >= '0' && ch <= '9';
   }

   bool isOperator(char ch) {
      return ch == '+' || ch == '-' || ch == '*' || ch == '/';
   }

   int toDigit(char ch) {
      return ch - '0';
   }

   void buildTree(string eqn) {
      for (int i = eqn.length() - 1; i >= 0; i--)
         insert(eqn[i]);
   }

   void postfix() {
      postOrder(peek());
   }

   void postOrder(TreeN*ptr) {
      if (ptr != NULL) {
         postOrder(ptr->l);
         postOrder(ptr->r);
         cout<<ptr->d;
      }
   }
   void infix() {
      inOrder(peek());
   }

   void inOrder(TreeN *ptr) {
      if (ptr != NULL) {
         inOrder(ptr->l);
         cout<<ptr->d;
         inOrder(ptr->r);
      }
   }
   void prefix() {
      preOrder(peek());
   }

   void preOrder(TreeN *ptr) {
      if (ptr != NULL) {
         cout<<ptr->d;
         preOrder(ptr->l);
         preOrder(ptr->r);
      }
   }
};

int main() {
   string s;
   ExpressionTree et;
   cout<<"\nEnter equation in Prefix form: ";
   cin>>s;
   et.buildTree(s);
   cout<<"\nPrefix : ";
   et.prefix();
   cout<<"\n\nInfix : ";
   et.infix();
   cout<<"\n\nPostfix : ";
   et.postfix();
}

出力

Enter equation in Prefix form: ++7*626
Prefix : ++7*626
Infix : 7+6*2+6
Postfix : 762*+6+

  1. 二分法のためのC++プログラム

    0であり、関数f(x)はaとbの間にある必要があります。つまりf(x)=[a、b ]。タスクは、二分法を使用して、関数f(x)の区間aとbの間にあるルートの値を見つけることです。 二分法とは何ですか? 二分法は、「a」と「b」で定義された指定された制限内の関数f(x)の根の値を見つけるために使用されます。関数の根は、f(a)=0となるような値aとして定義できます。 例 Quadratic equation F(x) =  - 8 This equation is equals to 0 when the value of x will be 2 i.e.  - 8 =

  2. 特定の式の式ツリーを構築するPythonプログラム

    式ツリーは、リーフノードが操作される値を持ち、内部ノードがリーフノードが実行される演算子を含むツリーです。 例:4 +((7 + 9)* 2) -のような式ツリーがあります この問題を解決するためのアプローチ 特定の式の式ツリーを構築するために、通常、スタックデータ構造を使用します。最初に、指定された接尾辞式を繰り返し処理し、以下の手順に従います- 指定された式でオペランドを取得した場合は、それをスタックにプッシュします。これは、式ツリーのルートになります。 演算子が式で2つの値を取得した場合は、式ツリーにその子として追加し、それらを現在のノードにプッシュします。 指定された式が完