Datenstruktur - Ausdrucksanalyse

Die Art und Weise, einen arithmetischen Ausdruck zu schreiben, ist als a bekannt notation. Ein arithmetischer Ausdruck kann in drei verschiedenen, aber äquivalenten Notationen geschrieben werden, dh ohne das Wesen oder die Ausgabe eines Ausdrucks zu ändern. Diese Notationen sind -

  • Infix-Notation
  • Präfix (polnisch) Notation
  • Postfix (Reverse-Polish) Notation

Diese Notationen werden so benannt, wie sie den Operator im Ausdruck verwenden. Das werden wir hier in diesem Kapitel lernen.

Infix-Notation

Wir schreiben Ausdruck in infix Notation, zB a - b + c, wo Operatoren verwendet werden in-zwischen Operanden. Es ist für uns Menschen leicht, in Infix-Notation zu lesen, zu schreiben und zu sprechen, aber das gleiche gilt nicht für Computergeräte. Ein Algorithmus zur Verarbeitung der Infixnotation kann hinsichtlich Zeit- und Raumverbrauch schwierig und kostspielig sein.

Präfixnotation

In dieser Notation ist der Operator prefixIn Operanden geschrieben, dh der Operator wird vor die Operanden geschrieben. Zum Beispiel,+ab. Dies entspricht der Infix-Notationa + b. Die Präfixnotation wird auch als bezeichnetPolish Notation.

Postfix-Notation

Dieser Notationsstil ist bekannt als Reversed Polish Notation. In diesem Notationsstil ist der Operatorpostfixzu den Operanden, dh der Operator wird nach den Operanden geschrieben. Zum Beispiel,ab+. Dies entspricht der Infix-Notationa + b.

Die folgende Tabelle versucht kurz, den Unterschied in allen drei Notationen zu zeigen -

Sr.Nr. Infix-Notation Präfixnotation Postfix-Notation
1 a + b + ab ab +
2 (a + b) ∗ c ∗ + abc ab + c ∗
3 a ∗ (b + c) ∗ a + bc abc + ∗
4 a / b + c / d + / ab / cd ab / cd / +
5 (a + b) ∗ (c + d) ∗ + ab + cd ab + cd + ∗
6 ((a + b) ∗ c) - d - ∗ + abcd ab + c ∗ d -

Analysieren von Ausdrücken

Wie wir bereits besprochen haben, ist es keine sehr effiziente Möglichkeit, einen Algorithmus oder ein Programm zum Parsen von Infix-Notationen zu entwerfen. Stattdessen werden diese Infixnotationen zuerst in Postfix- oder Präfixnotationen konvertiert und dann berechnet.

Um einen arithmetischen Ausdruck zu analysieren, müssen wir uns auch um die Priorität und Assoziativität des Operators kümmern.

Vorrang

Wenn sich ein Operand zwischen zwei verschiedenen Operatoren befindet, wird durch den Vorrang eines Operators vor anderen entschieden, welcher Operator zuerst den Operanden übernimmt. Zum Beispiel -

Da die Multiplikationsoperation Vorrang vor der Addition hat, wird zuerst b * c ausgewertet. Eine Tabelle mit der Priorität des Operators wird später bereitgestellt.

Assoziativität

Assoziativität beschreibt die Regel, nach der Operatoren mit derselben Priorität in einem Ausdruck erscheinen. Zum Beispiel haben im Ausdruck a + b - c sowohl + als auch - die gleiche Priorität. Welcher Teil des Ausdrucks zuerst ausgewertet wird, wird durch die Assoziativität dieser Operatoren bestimmt. Hier bleiben sowohl + als auch - assoziativ, sodass der Ausdruck als ausgewertet wird(a + b) − c.

Vorrang und Assoziativität bestimmen die Reihenfolge der Bewertung eines Ausdrucks. Es folgt eine Operator-Prioritäts- und Assoziativitätstabelle (höchste bis niedrigste) -

Sr.Nr. Operator Vorrang Assoziativität
1 Potenzierung ^ Höchste Richtig assoziativ
2 Multiplikation (∗) & Division (/) Zweithöchster Linker Assoziativer
3 Addition (+) & Subtraktion (-) Am niedrigsten Linker Assoziativer

Die obige Tabelle zeigt das Standardverhalten von Operatoren. Zu jedem Zeitpunkt der Ausdrucksbewertung kann die Reihenfolge mithilfe von Klammern geändert werden. Zum Beispiel -

Im a + b*c, der Ausdrucksteil b* *cwird zuerst bewertet, wobei die Multiplikation Vorrang vor der Addition hat. Wir verwenden hier Klammern füra + b zuerst ausgewertet werden, wie (a + b)*c.

Postfix-Bewertungsalgorithmus

Wir werden uns nun den Algorithmus zur Bewertung der Postfix-Notation ansehen -

Step 1 − scan the expression from left to right 
Step 2 − if it is an operand push it to stack 
Step 3 − if it is an operator pull operand from stack and perform operation 
Step 4 − store the output of step 3, back to stack 
Step 5 − scan the expression until all operands are consumed 
Step 6 − pop the stack and perform operation

Um die Implementierung in der Programmiersprache C zu sehen, klicken Sie bitte hier .