Epso

polsky

May 27th, 2012
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <clocale>
  5. #include <string.h>
  6.  
  7. #define MAXSIZE 100 // максимальный размер стека, входной и выходной строки
  8. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  9. int prioritet(char a); // вычисляет приоритет операции
  10. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  11.  
  12.  
  13. int main()
  14. {
  15.   setlocale(LC_ALL, "Russian");
  16.     char a[MAXSIZE]; // входная строка
  17.     char output[MAXSIZE]; // выходная строка
  18.     char stack[MAXSIZE];  // вспомогательный стек
  19.     int j=0, m=0, i=0; // начальные значения номера строки; i - для входной, m - выходной, j - стека
  20.     int len; // длина входной строки (кол-во операций)
  21.  
  22.   printf("Введите нормальное алгебраческое выражение: ");
  23.     scanf("%s",a);
  24.  
  25.     len = strlen(a);
  26.  
  27.     //while((i < len) && (a[i] != '0' || a[i] != '='))
  28.   while((i < len))
  29.     {
  30.         if ( a[i] >= 'a' && a[i] <= 'z') // символы записываем сразу в выходную строку
  31.         {
  32.             output[m] = a[i];
  33.             m++;
  34.         }
  35.         else if ( a[i] == '(' ) // если скобка, добавляем ее в стек.
  36.         {
  37.             stack[j] = a[i];
  38.             j++;
  39.         }
  40.         else if ( a[i] == '+' || a[i] == '-' || a[i] == '/' || a[i] == '*' ) // операции добавляем в стек.
  41.         {
  42.             if (j == 0)  // при пустом стеке добавляем операцию туда
  43.             {
  44.                 stack[j] = a[i];
  45.                 j++;
  46.             }
  47.             else
  48.             {
  49.                 if( prioritet( stack[j-1] ) < prioritet( a[i] ) ) // при не пустом, сравниваем приоритеты
  50.                 {
  51.                     stack[j] = a[i];
  52.                     j++;
  53.                 }
  54.                 else // если пpиоpитет меньше пеpеписываем в выходную стpоку все опеpации с большим или pавным пpиоpитетом записываем в стек поступившую опеpацию
  55.                 {
  56.                     while ( (j >= 1) && (prioritet ( stack[j-1] ) >= prioritet( a[i] )) )
  57.                     {
  58.                         output[m] = stack[j-1];
  59.                         m++;
  60.                         j--;
  61.                     }
  62.                     stack[j] = a[i];
  63.                     ++j;
  64.                 }
  65.             }
  66.         }
  67.         if ( a[i] == ')' )  // если закрывающаяся скобка, ищем в стеке последнюю открытую и и переписываем из стека в выходную строку
  68.         {
  69.             while ( stack[j-1] != '(' )
  70.             {
  71.                 output[m] = stack[j-1];
  72.                 j--;
  73.                 m++;
  74.             }
  75.             j--;
  76.         }
  77.         i++;
  78.     }
  79.     --j;
  80.     while (j >= 0) // если в стеке остались операции, переписываем их в выходную строку
  81.     {
  82.         output[m] = stack[j];
  83.         ++m;
  84.         --j;
  85.     }
  86.     output[m] = '\0'; // конец строки
  87.  
  88.     printf("\nВ польской записи это выражение: %s\n", output);
  89.     getch();
  90.  
  91.     return 0;
  92. }
  93.  
  94. int prioritet(char a)
  95. {
  96.     switch(a)
  97.   {
  98.     case '*':
  99.     case '/':
  100.          return 2;
  101.  
  102.     case '-':
  103.     case '+':
  104.          return 1;
  105.  
  106.     case '(':
  107.          return 0;
  108.   }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment