Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <conio.h>
- #include <clocale>
- #include <string.h>
- #define MAXSIZE 100 // максимальный размер стека, входной и выходной строки
- //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- int prioritet(char a); // вычисляет приоритет операции
- //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- int main()
- {
- setlocale(LC_ALL, "Russian");
- char a[MAXSIZE]; // входная строка
- char output[MAXSIZE]; // выходная строка
- char stack[MAXSIZE]; // вспомогательный стек
- int j=0, m=0, i=0; // начальные значения номера строки; i - для входной, m - выходной, j - стека
- int len; // длина входной строки (кол-во операций)
- printf("Введите нормальное алгебраческое выражение: ");
- scanf("%s",a);
- len = strlen(a);
- //while((i < len) && (a[i] != '0' || a[i] != '='))
- while((i < len))
- {
- if ( a[i] >= 'a' && a[i] <= 'z') // символы записываем сразу в выходную строку
- {
- output[m] = a[i];
- m++;
- }
- else if ( a[i] == '(' ) // если скобка, добавляем ее в стек.
- {
- stack[j] = a[i];
- j++;
- }
- else if ( a[i] == '+' || a[i] == '-' || a[i] == '/' || a[i] == '*' ) // операции добавляем в стек.
- {
- if (j == 0) // при пустом стеке добавляем операцию туда
- {
- stack[j] = a[i];
- j++;
- }
- else
- {
- if( prioritet( stack[j-1] ) < prioritet( a[i] ) ) // при не пустом, сравниваем приоритеты
- {
- stack[j] = a[i];
- j++;
- }
- else // если пpиоpитет меньше пеpеписываем в выходную стpоку все опеpации с большим или pавным пpиоpитетом записываем в стек поступившую опеpацию
- {
- while ( (j >= 1) && (prioritet ( stack[j-1] ) >= prioritet( a[i] )) )
- {
- output[m] = stack[j-1];
- m++;
- j--;
- }
- stack[j] = a[i];
- ++j;
- }
- }
- }
- if ( a[i] == ')' ) // если закрывающаяся скобка, ищем в стеке последнюю открытую и и переписываем из стека в выходную строку
- {
- while ( stack[j-1] != '(' )
- {
- output[m] = stack[j-1];
- j--;
- m++;
- }
- j--;
- }
- i++;
- }
- --j;
- while (j >= 0) // если в стеке остались операции, переписываем их в выходную строку
- {
- output[m] = stack[j];
- ++m;
- --j;
- }
- output[m] = '\0'; // конец строки
- printf("\nВ польской записи это выражение: %s\n", output);
- getch();
- return 0;
- }
- int prioritet(char a)
- {
- switch(a)
- {
- case '*':
- case '/':
- return 2;
- case '-':
- case '+':
- return 1;
- case '(':
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment