Habr├й рдкрд░ рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд┐рд╢ рдиреЛрдЯреЗрд╢рди (рд░рд┐рдХреЙрд░реНрдб) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА
рдмрддрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди рдореЗрдВ рдмрдиреНрджреА рдХреА рд╕рд╛рд░реА рд╢рдХреНрддрд┐ред рдЙрдкрдирд┐рд╖рдж рд╕реЗ рд╣рдореЗрдВ рдЕрд╡рдЧрдд рдХрд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЗрдиреНрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдХреЛ рдКрдкрд░ рдХреЗ рд▓реЗрдЦ рдореЗрдВ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА
рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рд░рд┐рд╡рд░реНрд╕ рдПрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рдХреНрд░реИрдВрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╢рд╛рдпрдж рдкрд╣рд▓рд╛ рд╕рд╡рд╛рд▓ рдЬреЛ рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ: "рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?" рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХреА рдЧрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдПрдХ рдЗрдирдлрд╝рд┐рдХреНрд╕ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрдиреНрджреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд░реЗрдВрдЧреЗред
рдЦреИрд░, рдЕрдм рдмрд┐рдВрджреБ рдХреЗ рдХрд░реАрдм:
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореМрдЦрд┐рдХ рд╡рд┐рд╡рд░рдг:
- рдпрджрд┐ рд╣рдо рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджреЗрддреЗ рд╣реИрдВ
- рдпрджрд┐ рд╣рдо рдСрдкрд░реЗрд╢рди рд╕рдВрдХреЗрдд рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ:
- рд╣рдо 2 рд╢реАрд░реНрд╖ рд╕реНрдЯреИрдХ рддрддреНрд╡ рд▓реЗрддреЗ рд╣реИрдВ
- рдпрджрд┐ рдкрд╣рд▓реЗ рддрддреНрд╡ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрдо рд╣реИ (рдФрд░ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ) рддреЛ рд╕рд╡рд╛рд▓ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ
- рдЗрд╕реА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП
- рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рдлрд╝реЙрд░реНрдо рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ: 2 рддрддреНрд╡ + рдСрдкрд░реЗрд╢рди рд╕рд╛рдЗрди + 1 рддрддреНрд╡
- рдпрджрд┐ рд░реЗрдЦрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрдВрд╕ рдЧрдИ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХрд╛ рдореВрд▓реНрдп рд╣реИ
C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
#include <string.h> #include <stdio.h> #include <stdlib.h> // <-- --> enum optype {power = 3, devide = 2, multiply = 2, minus = 1, plus = 1, null=0}; // struct stack { char val[100]; // optype type; // , stack * next; } *head; // <-- --> void push(char[], optype); void push(stack *); stack * pop(); // <-- --> void fromRPN(char *, char *); // (RPN) Reverse polish notation int main() { char infix[100], postfix[100]; // gets(infix); fromRPN(infix, postfix); printf("%s\n", postfix); system("PAUSE"); return 0; } void push(stack *t) { t->next = head; head = t; } void push(char str[], optype type) { stack *t; t = new stack; strcpy(t->val, str); t->type = type; t->next = head; head = t; } stack * pop() { stack *t; if(head == NULL) return NULL; t = head; head = t->next; return t; } void fromRPN(char * input, char * output) { char c, temp[100]; int p_temp=0; stack *h1, *h2; // optype type; head = NULL; while(*input) { // c = (*input); if(c>='0' && c<='9' || c=='.') { // temp[p_temp++] = c; // temp[p_temp] = '\0'; } else if(c==' ') { if(p_temp!=0) { push(temp, null); // p_temp=0; } temp[0] = '\0'; // } else if(c=='+' || c=='-'|| c=='*' || c=='/' || c=='^') { // h1 = pop(); // h2 = pop(); // // if(c=='+') type = plus; else if(c=='-') type = minus; else if(c=='*') type = multiply; else if(c=='/') type = devide; else if(c=='^') type = power; if(h2->type!=null && h2->type<type) { // 1- temp[0]='('; temp[1] = '\0'; // h2->val[strlen(h2->val)+2] = '\0'; h2->val[strlen(h2->val)+1] = c; // h2->val[strlen(h2->val)] = ')'; } else { h2->val[strlen(h2->val)+1] = '\0'; h2->val[strlen(h2->val)] = c; } strcat(temp, h2->val); if(h1->type!=null && h1->type<type) { // 2- strcat(temp, "("); h1->val[strlen(h1->val)+1] = '\0'; h1->val[strlen(h1->val)] = ')'; // } strcat(temp, h1->val); strcpy(h2->val, temp); // , delete h1; // h2->type = type; // push(h2); // } input++; } strcpy(output, (pop())->val); // }
рдХрд╛рдо рдХрд╛ рдЙрджрд╛рд╣рд░рдг
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рд╣рдмреНрд░ рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд▓реЗрдВрдЧреЗ:
: (8+2*5)/(1+3*2-4) : 8 2 5 * + 1 3 2 * + 4 - / "8" : {"8", null=0} "8" --: {"8", null=0} "2" --: {"2", null=0}, {"8", null=0} "5" --: {5, null=0}, {"2", null=0}, {"8", null=0} "*" --: {"2*5", multiply=2}, {"8", null=0} "+" --: {"8+2*5", plus=1} "1" --: {"1", null=0}, {"8+2*5", plus=1} "3" --: {"3", null=0}, {"1", null=0}, {"8+2*5", plus=1} "2" --: {"2", null=0}, {"3", null=0}, {"1", null=0}, {"8+2*5", plus=1} "*" --: {"3*2", multiply=2}, {"1", null=0}, {"8+2*5", plus=1} "+" --: {"1+3*2", plus=1}, {"8+2*5", plus=1} "4" --: {"4", null=0}, {"1+3*2", plus=1}, {"8+2*5", plus=1} "-" --: {"1+3*2-4", minus=1}, {"8+2*5", plus=1} "/" // , --: {"(8+2*5)/(1+3*2-4)", devide=2} : (8+2*5)/(1+3*2-4)