logo

Stablo izraza u strukturi podataka

Stablo izraza je stablo koje se koristi za predstavljanje različitih izraza. Struktura podataka stabla koristi se za predstavljanje izraznih izjava. U ovom stablu unutarnji čvor uvijek označava operatore.

  • Listni čvorovi uvijek označavaju operande.
  • Operacije se uvijek izvode na ovim operandima.
  • Operator prisutan u dubini stabla uvijek ima najveći prioritet.
  • Operator koji nije mnogo dublje u stablu uvijek ima najniži prioritet u odnosu na operatore koji leže na dubini.
  • Operand će uvijek biti prisutan na dubini stabla; stoga se smatra najveći prioritet među svim operaterima.
  • Ukratko, možemo to sažeti kao vrijednost prisutna na dubini stabla najvišeg je prioriteta u usporedbi s drugim operatorima prisutnima na vrhu stabla.
  • Glavna upotreba ovih izraznih stabala je da se koriste procijeniti, analizirati i modificirati razne izraze.
  • Također se koristi za određivanje asocijativnosti svakog operatora u izrazu.
  • Na primjer, operator + je lijevi asocijativ, a / je desni asocijativ.
  • Dilema ove asocijativnosti razjašnjena je upotrebom izraza stabla.
  • Ova izrazna stabla formirana su korištenjem gramatike bez konteksta.
  • Povezali smo pravilo u gramatikama bez konteksta ispred svake gramatičke produkcije.
  • Ta su pravila također poznata kao semantička pravila, a korištenjem tih semantičkih pravila možemo lako konstruirati stabla izraza.
  • To je jedan od glavnih dijelova dizajna prevoditelja i pripada fazi semantičke analize.
  • U ovoj semantičkoj analizi koristit ćemo prijevode usmjerene na sintaksu, au obliku izlaza proizvest ćemo označeno stablo raščlanjivanja.
  • Anotirano stablo raščlanjivanja nije ništa drugo nego jednostavno raščlanjivanje povezano s atributom tipa i svakim proizvodnim pravilom.
  • Glavni cilj korištenja stabala izraza je izrada složenih izraza i može se lako procijeniti pomoću ovih stabala izraza.
  • Ono je nepromjenjivo i nakon što smo kreirali stablo izraza, ne možemo ga mijenjati niti dalje modificirati.
  • Da biste izvršili više izmjena, potrebno je u cijelosti konstruirati novo stablo izraza.
  • Također se koristi za rješavanje procjene izraza postfiksa, prefiksa i infiksa.

Stabla izraza igraju vrlo važnu ulogu u predstavljanju jezična razina kod u obliku podataka, koji su uglavnom pohranjeni u strukturi stabla. Također se koristi u prikazu memorije lambda izraz. Koristeći strukturu podataka stabla, možemo izraziti lambda izraz transparentnije i eksplicitnije. Prvo se stvara za pretvaranje segmenta koda u segment podataka tako da se izraz može lako procijeniti.

Stablo izraza je binarno stablo u kojem svaki vanjski ili listni čvor odgovara operandu, a svaki unutarnji ili nadređeni čvor odgovara operatorima, tako da bi na primjer stablo izraza za 7 + ((1+8)*3) bilo:

Stablo izraza u strukturi podataka

Neka je S stablo izraza

Ako S nije nula, tada

Ako je S.vrijednost operand, tada

Povratak S.vrijednost

x = riješiti (S.lijevo)

y = riješiti (S.desno)

Povratni izračun (x, y, S.vrijednost)

Ovdje u gornjem primjeru stablo izraza koristilo je gramatiku bez konteksta.

Imamo neke produkcije povezane s nekim proizvodnim pravilima u ovoj gramatici, uglavnom poznate kao semantička pravila . Možemo definirati stvaranje rezultata iz odgovarajućih pravila proizvodnje pomoću ovih semantičkih pravila. Ovdje smo upotrijebili parametar vrijednosti koji će izračunati rezultat i vratiti ga na početni simbol gramatike. S.left će izračunati lijevo dijete čvora, a slično tome, desno dijete čvora može se izračunati pomoću parametra S.right.

Korištenje izraznog stabla

  1. Glavni cilj korištenja stabala izraza je izrada složenih izraza i može se lako procijeniti pomoću ovih stabala izraza.
  2. Također se koristi za određivanje asocijativnosti svakog operatora u izrazu.
  3. Također se koristi za rješavanje procjene izraza postfiksa, prefiksa i infiksa.

Implementacija stabla izraza

Da bismo implementirali stablo izraza i napisali njegov program, morat ćemo koristiti strukturu podataka stog.

Kako znamo da se stog temelji na LIFO principu zadnji ušao prvi izašao, podatkovni element koji je nedavno gurnut u stog je iskočio kad god je to bilo potrebno. Za njegovu implementaciju koriste se dvije glavne operacije steka, push i pop. Operacijom push gurnut ćemo element podataka u stog, a operacijom pop ukloniti element podataka sa stoga.

Glavne funkcije stoga u implementaciji stabla izraza:

Prije svega, napravit ćemo skeniranje zadanog izraza na način slijeva nadesno, zatim jedan po jedan provjeriti identificirani znak,

  1. Ako je skenirani znak operand, primijenit ćemo operaciju push i gurnuti ga u stog.
  2. Ako je skenirani znak operator, primijenit ćemo operaciju pop na njega da uklonimo dvije vrijednosti sa stoga kako bismo ih učinili njegovim podređenim, a nakon toga ćemo vratiti trenutni roditeljski čvor u stog.

Implementacija Expression stabla u C programskom jeziku

 // C program for expression tree implementation #include #include /* The below structure node is defined as a node of a binary tree consists of left child and the right child, along with the pointer next which points to the next node */ struct node { char info ; struct node* l ; struct node* r ; struct node* nxt ; }; struct node *head=NULL; /* Helper function that allocates a new node with the given data and NULL left and right pointers. */ struct node* newnode(char data) { struct node* node = (struct node*) malloc ( sizeof ( struct node ) ) ; node-&gt;info = data ; node-&gt;l = NULL ; node-&gt;r = NULL ; node-&gt;nxt = NULL ; return ( node ) ; } void Inorder(struct node* node) { if ( node == NULL) return ; else { /* first recur on left child */ Inorder ( node-&gt;l ) ; /* then print the data of node */ printf ( &apos;%c &apos; , node-&gt;info ) ; /* now recur on right child */ Inorder ( node-&gt;r ) ; } } void push ( struct node* x ) { if ( head == NULL ) head = x ; else { ( x )-&gt;nxt = head ; head = x ; } // struct node* temp ; // while ( temp != NULL ) // { // printf ( &apos; %c &apos; , temp-&gt;info ) ; // temp = temp-&gt;nxt ; // } } struct node* pop() { // Poping out the top most [pointed with head] element struct node* n = head ; head = head-&gt;nxt ; return n ; } int main() { char t[] = { &apos;X&apos; , &apos;Y&apos; , &apos;Z&apos; , &apos;*&apos; , &apos;+&apos; , &apos;W&apos; , &apos;/&apos; } ; int n = sizeof(t) / sizeof(t[0]) ; int i ; struct node *p , *q , *s ; for ( i = 0 ; i <n ; i++ ) { if read character is operator then popping two other elements from stack and making a binary tree ( t[i]="=" '+' || '-' '*' ' '^' s="newnode" t [ i ] p="pop()" q="pop()" s->l = q ; s-&gt;r = p; push(s); } else { s = newnode ( t [ i ] ) ; push ( s ) ; } } printf ( &apos; The Inorder Traversal of Expression Tree: &apos; ) ; Inorder ( s ) ; return 0 ; } </n>

Izlaz gornjeg programa je:

 X + Y * Z / W 

Implementacija Expression stabla u C++ programskom jeziku

 // C++ program for expression tree #include using namespace std ; /* The below class node is defined as a node of a binary tree consists of left child and the right child, along with the pointer next which points to the next node */ class node { public: char info ; node* l ; node* r ; node* nxt = NULL ; node ( char c ) { this-&gt;info = c ; l = NULL ; r = NULL ; } node() { l = NULL ; r = NULL ; } friend class Stack ; friend class tree ; } ; class Stack { node* head = NULL ; public: void push ( node* ) ; node* pop() ; friend class tree ; } ; class tree { public: void inorder ( node* x ) { // cout&lt;<'tree in inorder traversal is: '<l ) ; cout <info <r } void stack::push( node* x { if ( head="=" null we are inserting here nodes at the top of stack [following lifo principle] else x->nxt = head ; head = x ; } } node* Stack::pop() { // Poping out the top most [ pointed with head ] element node* p = head ; head = head-&gt;nxt ; return p ; } int main() { string str = &apos;XYZ*+W/&apos; ; // If you wish take input from user: //cout &lt;&lt; &apos;Insert Postorder Expression: &apos; &lt;&gt; s; Stack s ; tree t ; node *p, *q, *re; int n = str.length() ; for ( int i = 0 ; i <n ; i++ ) { if ( str[ i ]="=" '+' || '-' '*' ' '^') re="new" node( str[i] p="s.pop()" q="s.pop()" re->l = q ; re-&gt;r = p ; s.push(re) ; } else { re = new node( str[ i ] ) ; s.push(re) ; } } cout &lt;&lt; &apos; The Inorder Traversal of Expression Tree: &apos; ; t.inorder(re) ; return 0 ; } </n></'tree>

Izlaz gornjeg programa je:

 X + Y * Z / W 

Implementacija Expression stabla u programskom jeziku Java

 // Java program for expression tree import java.util.* ; /* The below class node is defined as a node of a binary tree consists of left child and the right child, along with the pointer next which points to the next node */ class Node { char info ; Node l , r ; public Node(char data) { this.info = data ; l = null ; r = null ; } } public class Main { public static boolean isOperator ( char ch ) { if ( ch == &apos;+&apos; || ch == &apos;-&apos; || ch == &apos;*&apos; || ch == &apos;/&apos; || ch == &apos;^&apos; ) { return true ; } return false ; } public static Node Tree ( String postfix ) { Stack st = new Stack(); Node t1,t2,temp ; for ( int i = 0 ; i <p> <strong>The output of the above program is:</strong> </p> <pre> X + Y * Z / W </pre> <hr>