Napište program, který převede výraz Infix do podoby Postfixu.
Infixový výraz: Vyjádření ve tvaru a operátor b (a + b), tj. když je operátor mezi každou dvojicí operandů.
Postfixový výraz: Vyjádření ve tvaru a b operátor (ab+), tj. když za každou dvojicí operandů následuje operátor.
Příklady:
Vstup: A + B * C + D
Výstup: ABC*+D+Vstup: ((A + B) – C * (D / E)) + F
Výstup: AB+CDE/*-F+
Proč postfixová reprezentace výrazu?
Kompilátor prohledává výraz buď zleva doprava, nebo zprava doleva.
Zvažte výraz: a + b * c + d
- Kompilátor nejprve prohledá výraz, aby vyhodnotil výraz b * c, poté znovu prohledá výraz, aby k němu přidal a.
- Výsledek se pak přičte k d po dalším skenování.
Opakované skenování je velmi neefektivní. Infixové výrazy jsou snadno čitelné a řešitelné pro lidi, zatímco počítač nedokáže snadno rozlišit operátory a závorky, takže je lepší výraz před vyhodnocením převést do postfixové (nebo prefixové) formy.
Odpovídající výraz ve formě postfixu je abc*+d+ . Postfixové výrazy lze snadno vyhodnotit pomocí zásobníku.
Jak převést výraz Infix na výraz Postfix?
Chcete-li převést infixový výraz na postfixový výraz, použijte Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Naskenujte infixový výraz zleva doprava .
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Pokud je naskenovaný znak operand, vložte jej do postfixového výrazu.
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- V opačném případě proveďte následující
- Pokud je priorita a asociativita naskenovaného operátoru větší než priorita a asociativita operátoru v zásobníku [nebo je zásobník prázdný nebo zásobník obsahuje „ ( ‘ ] a poté jej zatlačte do stohu. [‘ ^ „operátor je správně asociativní a další operátory jako „ + ',' – ',' * ' a ' / ‘ jsou asociativní vlevo].
- Zkontrolujte zejména stav, kdy operátor v horní části stohu a naskenovaný operátor jsou „ ^ ‘. V tomto stavu je priorita snímaného operátora vyšší díky jeho správné asociativitě. Bude tedy zatlačen do zásobníku operátora.
- Ve všech ostatních případech, kdy je horní část zásobníku operátorů stejná jako naskenovaný operátor, pak operátor vyskočí ze zásobníku kvůli asociativitě vlevo, díky níž má naskenovaný operátor menší přednost.
- V opačném případě vyberte všechny operátory ze zásobníku, které mají větší nebo stejnou prioritu než naskenovaný operátor.
- Poté zatlačte naskenovanou obsluhu do stohu. (Pokud při vyskakování narazíte na závorku, zastavte se a zatlačte naskenovaný operátor do zásobníku.)
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Pokud je naskenovaný znak „ ( ‘, zatlačte jej do zásobníku.
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Pokud je naskenovaný znak „ ) “, vysuňte zásobník a vystupujte, dokud se „ ( ‘ a zahoďte obě závorky.
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Opakujte kroky 2-5 dokud není naskenován infixový výraz.
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
kontrola java je nulová
- Po dokončení skenování vyklopte zásobník a přidejte operátory do výrazu postfixu, dokud nebude prázdný.
- Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Nakonec vytiskněte postfixový výraz.
Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Ilustrace:
Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
- Pro lepší pochopení postupujte podle níže uvedeného obrázku Níže jsou uvedeny kroky k realizaci výše uvedené myšlenky:
Zvažte infixový výraz exp = a+b*c+d
a infixový výraz je naskenován pomocí iterátoru i , který je inicializován jako i = 0 .1. krok: Zde i = 0 a exp[i] = „a“, tj. operand. Přidejte to tedy do výrazu postfixu. Proto, postfix = a .
Přidejte „a“ do postfixu
2. krok: Zde i = 1 a exp[i] = „+“, tj. operátor. Zatlačte to do stohu. postfix = a a zásobník = {+} .
Stiskněte „+“ v zásobníku
3. krok: Nyní i = 2 a exp[i] = ‚b‘, tj. operand. Přidejte to tedy do výrazu postfixu. postfix = ab a zásobník = {+} .
Přidejte „b“ do postfixu
4. krok: Nyní i = 3 a exp[i] = ‚*‘, tj. operátor. Zatlačte to do stohu. postfix = ab a zásobník = {+, *} .
Stiskněte „*“ v zásobníku
5. krok: Nyní i = 4 a exp[i] = „c“, tj. operand. Přidejte to do výrazu postfixu. postfix = abc a zásobník = {+, *} .
Přidejte „c“ do postfixu
6. krok: Nyní i = 5 a exp[i] = „+“, tj. operátor. Nejvyšší prvek zásobníku má vyšší prioritu. Takže pop, dokud se zásobník nevyprázdní nebo horní prvek nebude mít menší prioritu. ‚*‘ se objeví a přidá se do postfixu. Tak postfix = abc* a zásobník = {+} .
Pop „*“ a přidejte do postfixu
Nyní je horním prvkem „ + ‘ to také nemá menší přednost. Pusť to. postfix = abc*+ .
Pop „+“ a přidejte jej do postfixu
Nyní je zásobník prázdný. Tak zatlačte '+' v zásobníku. zásobník = {+} .
Stiskněte „+“ v zásobníku
7. krok: Nyní i = 6 a exp[i] = „d“, tj. operand. Přidejte to do výrazu postfixu. postfix = abc*+d .
Přidejte „d“ do postfixu
Poslední krok: Nyní nezůstal žádný prvek. Vyprázdněte tedy zásobník a přidejte jej do postfixového výrazu. postfix = abc*+d+ .
Pop „+“ a přidejte jej do postfixu
Níže je uvedena implementace výše uvedeného algoritmu:
CJáva#include #include #include // Function to return precedence of operators int prec(char c) c == '-') return 1; else return -1; // Function to return associativity of operators char associativity(char c) { if (c == '^') return 'R'; return 'L'; // Default to left-associative } // The main function to convert infix expression to postfix expression void infixToPostfix(char s[]) { char result[1000]; int resultIndex = 0; int len = strlen(s); char stack[1000]; int stackIndex = -1; for (int i = 0; i < len; i++) { char c = s[i]; // If the scanned character is an operand, add it to the output string. if ((c>= 'a' && c<= 'z') || (c>= 'A' && c<= 'Z') || (c>= '0' && c<= '9')) { result[resultIndex++] = c; } // If the scanned character is an ‘(‘, push it to the stack. else if (c == '(') { stack[++stackIndex] = c; } // If the scanned character is an ‘)’, pop and add to the output string from the stack // until an ‘(‘ is encountered. else if (c == ')') { while (stackIndex>= 0 && stack[stackIndex] != '(') { result[resultIndex++] = stack[stackIndex--]; } stackIndex--; // Pop '(' } // Pokud je operátor skenován else { while (stackIndex>= 0 && (prec(s[i])< prec(stack[stackIndex]) || prec(s[i]) == prec(stack[stackIndex]) && associativity(s[i]) == 'L')) { result[resultIndex++] = stack[stackIndex--]; } stack[++stackIndex] = c; } } // Pop all the remaining elements from the stack while (stackIndex>= 0) { vysledek[resultIndex++] = stack[stackIndex--]; } vysledek[index_výsledku] = ' '; printf('%s ', vysledek); } // Kód ovladače int main() { char exp[] = 'a+b*(c^d-e)^(f+g*h)-i'; // Volání funkce infixToPostfix(exp); návrat 0; }>Krajtaimport java.util.Stack; public class InfixToPostfix { // Function to return precedence of operators static int prec(char c) // Function to return associativity of operators static char associativity(char c) { if (c == '^') return 'R'; return 'L'; // Default to left-associative } // The main function to convert infix expression to postfix expression static void infixToPostfix(String s) { StringBuilder result = new StringBuilder(); Stackstack = new Stack(); for (int i = 0; i< s.length(); i++) { char c = s.charAt(i); // If the scanned character is an operand, add it to the output string. if ((c>= 'a' && c<= 'z') || (c>= 'A' && c<= 'Z') || (c>= '0' && c<= '9')) { result.append(c); } // If the scanned character is an ‘(‘, push it to the stack. else if (c == '(') { stack.push(c); } // If the scanned character is an ‘)’, pop and add to the output string from the stack // until an ‘(‘ is encountered. else if (c == ')') { while (!stack.isEmpty() && stack.peek() != '(') { result.append(stack.pop()); } stack.pop(); // Pop '(' } // If an operator is scanned else { while (!stack.isEmpty() && (prec(s.charAt(i)) < prec(stack.peek()) || prec(s.charAt(i)) == prec(stack.peek()) && associativity(s.charAt(i)) == 'L')) { result.append(stack.pop()); } stack.push(c); } } // Pop all the remaining elements from the stack while (!stack.isEmpty()) { result.append(stack.pop()); } System.out.println(result); } // Driver code public static void main(String[] args) { String exp = 'a+b*(c^d-e)^(f+g*h)-i'; // Function call infixToPostfix(exp); } }> C#def prec(c): if c == '^': return 3 elif c == '/' or c == '*': return 2 elif c == '+' or c == '-': return 1 else: return -1 def associativity(c): if c == '^': return 'R' return 'L' # Default to left-associative def infix_to_postfix(s): result = [] stack = [] for i in range(len(s)): c = s[i] # If the scanned character is an operand, add it to the output string. if ('a' <= c <= 'z') or ('A' <= c <= 'Z') or ('0' <= c <= '9'): result.append(c) # If the scanned character is an ‘(‘, push it to the stack. elif c == '(': stack.append(c) # If the scanned character is an ‘)’, pop and add to the output string from the stack # until an ‘(‘ is encountered. elif c == ')': while stack and stack[-1] != '(': result.append(stack.pop()) stack.pop() # Pop '(' # If an operator is scanned else: while stack and (prec(s[i]) < prec(stack[-1]) or (prec(s[i]) == prec(stack[-1]) and associativity(s[i]) == 'L')): result.append(stack.pop()) stack.append(c) # Pop all the remaining elements from the stack while stack: result.append(stack.pop()) print(''.join(result)) # Driver code exp = 'a+b*(c^d-e)^(f+g*h)-i' # Function call infix_to_postfix(exp)>Javascriptusing System; using System.Collections.Generic; class Program { // Function to return precedence of operators static int Prec(char c) c == '*') return 2; else if (c == '+' // Function to return associativity of operators static char Associativity(char c) { if (c == '^') return 'R'; return 'L'; // Default to left-associative } // The main function to convert infix expression to postfix expression static void InfixToPostfix(string s) { Stackzásobník = nový zásobník (); Seznam výsledek = nový seznam (); for (int i = 0; i< s.Length; i++) { char c = s[i]; // If the scanned character is an operand, add it to the output string. if ((c>= 'a' && c<= 'z') || (c>= 'A' && c<= 'Z') || (c>= '0' && c<= '9')) { result.Add(c); } // If the scanned character is an ‘(‘, push it to the stack. else if (c == '(') { stack.Push(c); } // If the scanned character is an ‘)’, pop and add to the output string from the stack // until an ‘(‘ is encountered. else if (c == ')') { while (stack.Count>0 && stack.Peek() != '(') { result.Add(stack.Pop()); } stack.Pop(); // Pop '(' } // Pokud je operátor skenován else { while (stack.Count> 0 && (Prec(s[i])< Prec(stack.Peek()) || Prec(s[i]) == Prec(stack.Peek()) && Associativity(s[i]) == 'L')) { result.Add(stack.Pop()); } stack.Push(c); } } // Pop all the remaining elements from the stack while (stack.Count>0) { result.Add(stack.Pop()); } Console.WriteLine(string.Join('', výsledek)); } // Kód ovladače statický void Main() { string exp = 'a+b*(c^d-e)^(f+g*h)-i'; // Volání funkce InfixToPostfix(exp); } }> C++14/* Javascript implementation to convert infix expression to postfix*/ //Function to return precedence of operators function prec(c) c == '-') return 1; else return -1; // The main function to convert infix expression //to postfix expression function infixToPostfix(s) { let st = []; //For stack operations, we are using JavaScript built in stack let result = ''; for(let i = 0; i < s.length; i++) { let c = s[i]; // If the scanned character is // an operand, add it to output string. if((c>= 'a' && c<= 'z') || (c>= 'A' && c<= 'Z') || (c>= '0' && c<= '9')) result += c; // If the scanned character is an // ‘(‘, push it to the stack. else if(c == '(') st.push('('); // If the scanned character is an ‘)’, // pop and to output string from the stack // until an ‘(‘ is encountered. else if(c == ')') { while(st[st.length - 1] != '(') { result += st[st.length - 1]; st.pop(); } st.pop(); } //If an operator is scanned else { while(st.length != 0 && prec(s[i]) <= prec(st[st.length - 1])) { result += st[st.length - 1]; st.pop(); } st.push(c); } } // Pop all the remaining elements from the stack while(st.length != 0) { result += st[st.length - 1]; st.pop(); } console.log(result + ''); } let exp = 'a+b*(c^d-e)^(f+g*h)-i'; infixToPostfix(exp); // This code is contributed by decode2207.>#include using namespace std; // Function to return precedence of operators int prec(char c) c == '*') return 2; else if (c == '+' // Function to return associativity of operators char associativity(char c) { if (c == '^') return 'R'; return 'L'; // Default to left-associative } // The main function to convert infix expression // to postfix expression void infixToPostfix(string s) { stackSvatý; řetězec výsledek; for (int i = 0; i< s.length(); i++) { char c = s[i]; // If the scanned character is // an operand, add it to the output string. if ((c>= 'a' && c<= 'z') || (c>= 'A' && c<= 'Z') || (c>= '0' && c<= '9')) result += c; // If the scanned character is an // ‘(‘, push it to the stack. else if (c == '(') st.push('('); // If the scanned character is an ‘)’, // pop and add to the output string from the stack // until an ‘(‘ is encountered. else if (c == ')') { while (st.top() != '(') { result += st.top(); st.pop(); } st.pop(); // Pop '(' } // If an operator is scanned else { while (!st.empty() && prec(s[i]) < prec(st.top()) || !st.empty() && prec(s[i]) == prec(st.top()) && associativity(s[i]) == 'L') { result += st.top(); st.pop(); } st.push(c); } } // Pop all the remaining elements from the stack while (!st.empty()) { result += st.top(); st.pop(); } cout << result << endl; } // Driver code int main() { string exp = 'a+b*(c^d-e)^(f+g*h)-i'; // Function call infixToPostfix(exp); return 0; }>
Výstupabcd^e-fgh*+^*+i->Časová náročnost: O(N), kde N je velikost infixového výrazu
Pomocný prostor: O(N), kde N je velikost infixového výrazu









