Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <string>
  4. using namespace std;
  5. int prior(char x) {//приоритет
  6.     int i;
  7.     switch (x)
  8.     {
  9.     case '(': i = 0; break;
  10.     case ')': i = 1; break;
  11.     case '+': i = 2; break;
  12.     case '-': i = 2; break;
  13.     case '*': i = 3; break;
  14.     case '/': i = 3; break;
  15.     case '^': i = 4; break;
  16.     }
  17.     return i;
  18. }
  19.  
  20. int main() {
  21.     string s;
  22.     stack <char> steck;
  23.     cin >> s;
  24.     string st;
  25.     int c = s.length(), i;
  26.  
  27.  
  28.  
  29.     for (i = 0; i < c; i++)//перебор строки
  30.     {
  31.         if (s[i] == '(' || s[i] == ')') {//скобки
  32.             if (s[i] == ')') {//закрывающая скобка
  33.                 st += ' ';
  34.                 do {
  35.                     st += steck.top();//перенос всех символов
  36.                     st += ' ';
  37.                     steck.pop();//удаление открывающей скобки
  38.                 } while (steck.top() != '(');
  39.                 steck.pop();
  40.             }
  41.             else
  42.                 steck.push(s[i]);
  43.         }
  44.         else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '^') { //операции
  45.             if (steck.empty() || prior(s[i]) > prior(steck.top()))//стек пуст или вершина имеет приоритет ниже
  46.             {
  47.                 steck.push(s[i]);//добавляем элемент в стек
  48.                 st += ' ';//разделение чисел
  49.             }
  50.             else {// вершина с высоким приоритетом
  51.                 while (!steck.empty() && prior(s[i]) <= prior(steck.top()))// переносим элементы из стека в строку, пока условие не изменится
  52.                 {
  53.                     st += ' ';
  54.                     st += steck.top();
  55.                     st += ' ';
  56.                     steck.pop();
  57.                 }
  58.                 steck.push(s[i]);
  59.             }
  60.         }
  61.         else {
  62.             st += s[i];
  63.         }
  64.  
  65.     }
  66.  
  67.     while (!steck.empty()) {
  68.         st += steck.top();
  69.         st += ' ';
  70.         steck.pop();
  71.     }
  72.  
  73.     cout << "ОПЗ: " << st;
  74.  
  75.     stack <string> stack2;
  76.     int x1, x2, x3;
  77.     string l1, l2 = "";
  78.     c = st.length();
  79.  
  80.     for (i = 0; i < c; i++)//перебор строки
  81.     {
  82.         if (st[i] == '+' || st[i] == '-' || st[i] == '*' || st[i] == '/' || st[i] == '^')
  83.         {        //операции над числами
  84.             x1 = stoi(stack2.top());
  85.             stack2.pop();
  86.             x2 = stoi(stack2.top());
  87.             stack2.pop();
  88.             switch (st[i])
  89.             {
  90.             case '+': x3 = x2 + x1; break;
  91.             case '-': x3 = x2 - x1; break;
  92.             case '*': x3 = x2 * x1; break;
  93.             case '/': x3 = x2 / x1; break;
  94.             case '^': x3 = x2 ^ x1; break;
  95.             }
  96.             l1 = to_string(x3);
  97.             stack2.push(l1);
  98.         }
  99.         else {
  100.             if (st[i] == ' ')
  101.             {
  102.                 if (l2.length())
  103.                 {
  104.                     stack2.push(l2);
  105.                     l2 = "";
  106.                 }
  107.             }
  108.             else
  109.             {
  110.                 l2 += st[i];
  111.             }
  112.         }
  113.  
  114.     }
  115.     cout << " = " << stack2.top();
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement