Infix в Postfix с использованием разных значений приоритета для In-Stack и Out-Stack
Преобразование инфикса в постфиксное выражение может быть выполнено элегантно, используя две функции приоритета. Каждому оператору присваивается значение (большее значение означает более высокий приоритет), которое зависит от того, находится ли оператор внутри стека или вне его. Также правую и левую ассоциативность для разных операторов можно обрабатывать, изменяя ее значения в двух функциях приоритета.
Пример инфиксного выражения: a + b * c
Соответствующее ему постфиксное выражение : abc * +
Чтобы узнать больше об инфиксных и постфиксных выражениях, посетите ссылки.
Примечание: в этой статье мы предполагаем, что все операторы ассоциативны слева направо.
Примеры:
Input: str = “a+b*c-(d/e+f*g*h)”
Output: abc*+de/fg*h*+-Input: a+b*c
Output: abc*+
Подход:
- Если вводимый символ является операндом, распечатайте его.
- Если вводимый символ является оператором -
- Если стек пуст, поместите его в стек.
- Если его значение приоритета больше, чем значение приоритета верхнего символа, нажмите.
- Если его значение приоритета меньше или равно, тогда извлекать из стека и печатать, в то время как приоритет верхнего символа больше, чем значение приоритета входного символа.
- Если вводимый символ - ')', то выталкивайте и печатайте до тех пор, пока верхний не станет '('. (Pop '(', но не печатайте его.)
- Если стек становится пустым до появления символа '(', то это недопустимое выражение.
- Повторяйте шаги 1–4, пока входное выражение не будет полностью прочитано.
- Вытащите оставшиеся элементы из стопки и распечатайте их.
Вышеупомянутый метод обрабатывает правую ассоциативность оператора возведения в степень (здесь ^), присваивая ему более высокое значение приоритета вне стека и более низкое значение приоритета внутри стека, тогда как это противоположно для левоассоциативных операторов.
Ниже представлена реализация описанного выше подхода:
C ++
// C++ program to convert an infix expression to a // postfix expression using two precedence function #include <bits/stdc++.h> using namespace std; // to check if the input character // is an operator or a '(' int isOperator( input) char { switch (input) { case '+' : return 1; case '-' : return 1; case '*' : return 1; case '%' : return 1; case '/' : return 1; case '(' : return 1; } return 0; } // to check if the input character is an operand int isOperand( input) char { if (input >= 65 && input <= 90 || input >= 97 && input <= 122) return 1; return 0; } // function to return precedence value // if operator is present in stack int inPrec( input) char { switch (input) { case '+' : case '-' : return 2; case '*' : case '%' : case '/' : return 4; case '(' : return 0; } } // function to return precedence value // if operator is present outside stack. int outPrec( input) char { switch (input) { case '+' : case '-' : return 1; case '*' : case '%' : case '/' : return 3; case '(' : return 100; } } // function to convert infix to postfix void inToPost( char * input) { stack< char > s; // while input is not NULL iterate int i = 0; while (input[i] != ' |