Преди да разберем преобразуването от инфиксна към постфиксна нотация, трябва да знаем за инфиксната и постфиксната нотация поотделно.
Инфикс и постфикс са изразите. Изразът се състои от константи, променливи и символи. Символите могат да бъдат оператори или скоби. Всички тези компоненти трябва да бъдат подредени според набор от правила, така че всички тези изрази да могат да бъдат оценени с помощта на набора от правила.
Примери за изрази са:
5 + 6
А - Б
(P * 5)
Всички горни изрази имат обща структура, т.е. имаме оператор между двата операнда. Операндът е обект или стойност, върху която трябва да се извърши операцията. В горните изрази 5, 6 са операндите, докато '+', '-' и '*' са операторите.
Какво е инфикс нотация?
Когато операторът е написан между операндите, той е известен като инфикс нотация . Операндът не трябва винаги да е константа или променлива; може да бъде и самият израз.
Например,
(p + q) * (r + s)
обработка на низове в c++
В горния израз и двата израза на оператора за умножение са операндите, т.е. (p + q) , и (r + s) са операндите.
В горния израз има три оператора. Операндите за първия оператор плюс са p и q, операндите за втория оператор плюс са r и s. Докато изпълнявате операции върху израза, трябва да следваме някакъв набор от правила, за да оценим резултата. В горния израз, операцията на събиране ще бъде извършена върху двата израза, т.е. p+q и r+s, и след това ще бъде извършена операцията за умножение.
Синтаксисът на инфиксната нотация е даден по-долу:
Ако има само един оператор в израза, не изискваме прилагане на никакво правило. Например 5 + 2; в този израз може да се извърши операция за добавяне между двата операнда (5 и 2), а резултатът от операцията ще бъде 7.
Ако има няколко оператора в израза, тогава трябва да се следва някакво правило, за да се оцени изразът.
Ако изразът е:
какво е 10 от 1 милион
4+6*2
Ако първо се изчисли операторът плюс, тогава изразът ще изглежда така:
10 * 2 = 20
Ако първо се изчисли операторът за умножение, тогава изразът ще изглежда така:
4 + 12 = 16
execlp
Горният проблем може да бъде решен чрез спазване на правилата за приоритет на операторите. В алгебричния израз редът на приоритета на оператора е даден в таблицата по-долу:
Оператори | Символи |
---|---|
Скоба | ( ), {}, [ ] |
Експоненти | ^ |
Умножение и деление | *, / |
Събиране и изваждане | + , - |
Първото предпочитание се дава на скобата; тогава следващото предпочитание се дава на експонентите. В случай на множество експонентни оператори, тогава операцията ще се приложи отдясно наляво.
Например:
2^2^3 = 2^8
= 256
След степента се оценяват операторите за умножение и деление. Ако и двата оператора присъстват в израза, тогава операцията ще се приложи отляво надясно.
Следващото предпочитание се дава на събирането и изваждането. Ако и двата оператора са налични в израза, тогава вървим отляво надясно.
Операторите, които имат същия приоритет, наречени as операторна асоциативност . Ако вървим отляво надясно, тогава е известно като ляво-асоциативно. Ако вървим отдясно наляво, тогава това е известно като дясно-асоциативно.
Проблем с инфиксната нотация
За да оценим инфиксния израз, трябва да знаем за приоритет на оператора правила и ако операторите имат еднакъв приоритет, тогава трябва да следваме асоциативност правила. Използването на скоби е много важно в инфиксната нотация за контролиране на реда, в който трябва да се извърши операцията. Скобите подобряват четливостта на израза. Инфикс изразът е най-често срещаният начин за писане на израз, но не е лесно да се анализира и оцени инфикс изразът без двусмислие. И така, математиците и логиците проучиха този проблем и откриха два други начина за писане на изрази, които са префикс и постфикс. И двата израза не изискват никакви скоби и могат да бъдат анализирани без двусмислие. Не изисква приоритет на оператора и правила за асоциативност.
Постфиксен израз
Постфиксният израз е израз, в който операторът е написан след операндите. Например постфиксният израз на инфиксна нотация ( 2+3) може да бъде написан като 23+.
Някои ключови моменти относно постфиксния израз са:
- В постфиксния израз операциите се извършват в реда, в който са записани отляво надясно.
- Не изисква никакви скоби.
- Не е необходимо да прилагаме правила за приоритет на оператори и правила за асоциативност.
Алгоритъм за изчисляване на постфиксния израз
- Сканирайте израза отляво надясно, докато не срещнем оператор.
- Извършете операцията
- Заменете израза с неговата изчислена стойност.
- Повторете стъпките от 1 до 3, докато не съществуват повече оператори.
Нека разберем горния алгоритъм чрез пример.
Инфиксен израз: 2 + 3 * 4
Ще започнем да сканираме отляво по-голямата част от израза. Операторът за умножение е оператор, който се появява първи при сканиране отляво надясно. Сега изразът ще бъде:
опората на пандата
Израз = 2 + 34*
= 2 + 12
Отново ще сканираме отляво надясно и изразът ще бъде:
Израз = 2 12 +
= 14
Оценка на постфиксен израз с помощта на стек.
- Сканирайте израза отляво надясно.
- Ако срещнем някакъв операнд в израза, тогава избутваме операнда в стека.
- Когато срещнем оператор в израза, изваждаме съответните операнди от стека.
- Когато приключим със сканирането на израза, крайната стойност остава в стека.
Нека разберем оценката на постфиксния израз с помощта на стека.
Пример 1: Постфиксен израз: 2 3 4 * +
Вход | Стек | |
---|---|---|
2 3 4 * + | празен | Натиснете 2 |
3 4 * + | 2 | Натиснете 3 |
4*+ | 3 2 | Натиснете 4 |
* + | 4 3 2 | Извадете 4 и 3 и изпълнете 4*3 = 12. Натиснете 12 в стека. |
+ | 12 2 | Извадете 12 и 2 от стека и изпълнете 12+2 = 14. Натиснете 14 в стека. |
Резултатът от горния израз е 14.
Пример 2: Постфиксен израз: 3 4 * 2 5 * +
Вход | Стек | |
---|---|---|
3 4 * 2 5 * + | празен | Натиснете 3 |
4*2 5*+ | 3 | Натиснете 4 |
*2 5 * + | 4 3 | Извадете 3 и 4 от стека и изпълнете 3*4 = 12. Натиснете 12 в стека. |
2 5 * + | 12 | Натиснете 2 |
5*+ | 2 12 | Натиснете 5 |
*+ | 5 2 12 | Извадете 5 и 2 от стека и изпълнете 5*2 = 10. Натиснете 10 в стека. |
+ | 10 12 | Извадете 10 и 12 от стека и изпълнете 10+12 = 22. Натиснете 22 в стека. |
Резултатът от горния израз е 22.
безплатен ipconfig
Алгоритъм за оценка на постфиксен израз
- Прочетете знак
- Ако знакът е цифра, преобразувайте знака в int и поставете цялото число в стека.
- Ако символът е оператор,
- Извадете елементите от стека два пъти, за да получите два операнда.
- Извършете операцията
- Поставете резултата в стека.
Преобразуване на инфикс в постфикс
Тук ще използваме стековата структура от данни за преобразуване на инфиксен израз в префиксен израз. Всеки път, когато се срещне оператор, ние избутваме оператор в стека. Ако срещнем операнд, тогава добавяме операнд към израза.
Правила за преобразуване от инфиксен към постфиксен израз
- Отпечатайте операнда, когато пристигнат.
- Ако стекът е празен или съдържа лява скоба отгоре, натиснете входящия оператор върху стека.
- Ако входящият символ е '(', натиснете го върху стека.
- Ако входящият символ е ')', извадете стека и отпечатайте операторите, докато се намери лявата скоба.
- Ако входящият символ има по-висок приоритет от горната част на стека, натиснете го върху стека.
- Ако входящият символ има по-нисък приоритет от горната част на стека, извадете и отпечатайте горната част на стека. След това тествайте входящия оператор спрямо новия връх на стека.
- Ако входящият оператор има същия приоритет като горната част на стека, тогава използвайте правилата за асоциативност. Ако асоциативността е отляво надясно, извадете и отпечатайте горната част на стека, след което натиснете входящия оператор. Ако асоциативността е отдясно наляво, натиснете входящия оператор.
- В края на израза извадете и отпечатайте всички оператори на стека.
Нека разберем чрез пример.
Инфикс израз: K + L - M*N + (O^P) * W/U/V * T + Q
Входен израз | Стек | Постфиксен израз |
---|---|---|
К | К | |
+ | + | |
Л | + | К Л |
- | - | K L+ |
М | - | K L+ M |
* | -* | K L+ M |
н | -* | K L + M N |
+ | + | K L + M N* K L + M N* - |
( | + ( | K L + M N *- |
О | + ( | K L + M N * - O |
^ | + (^ | K L + M N* - O |
П | + (^ | K L + M N* - O P |
) | + | K L + M N* - O P ^ |
* | + * | K L + M N* - O P ^ |
IN | + * | K L + M N* - O P ^ W |
/ | + / | K L + M N* - O P ^ W * |
IN | + / | K L + M N* - O P ^W*U |
/ | + / | K L + M N* - O P ^W*U/ |
IN | + / | KL + MON*-UP^W*U/F |
* | + * | KL+MON*-UP^W*U/F/ |
T | + * | KL+MN*-UP^W*U/F/T |
+ | + | KL+MON*-UP^W*U/F/T* KL+MN*-UP^W*U/F/T*+ |
Q | + | KL+MN*-OP^W*U/V/T*Q |
KL+MN*-OP^W*U/V/T*+Q+ |
Крайният постфиксен израз на инфикс израз (K + L - M*N + (O^P) * W/U/V * T + Q) е KL+MN*-OP^W*U/V/T*+Q+ .