Advertisement
selebry

7SiAOD

Apr 19th, 2022
1,047
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <locale>  
  4. using namespace std;
  5. short privilege(char ch) {
  6.     if (ch == '+' || ch == '-') {
  7.         return 1;
  8.     }
  9.     if (ch == '*' || ch == '/') {
  10.         return 2;
  11.     }
  12.     if (ch == '^') {
  13.         return 3;
  14.     }
  15.     return 0;
  16. }
  17. //LIFO - last in first out
  18. template<typename T>
  19. struct Stack {
  20.     T* arr=nullptr;
  21.     int size = 0, max_size=1000;
  22. };
  23. template<typename T>
  24. void push(Stack<T>& s, T t) {
  25.     if (s.size == 0) { s.arr = new T[++s.size]; s.arr[0] = t; return; }
  26.     T* tmp_arr = new T[++s.size];
  27.     for (int i = 0; i < s.size - 1; i++) tmp_arr[i] = s.arr[i];
  28.     tmp_arr[s.size - 1] = t;
  29.     delete[] s.arr;
  30.     s.arr = tmp_arr;
  31. }
  32. template<typename T>
  33. bool empty(Stack<T> s) {
  34.     return (s.arr == nullptr || s.size == 0) ? true : false;
  35. }
  36. template<typename T>
  37. T top(Stack<T> s) {
  38.     return s.arr[s.size - 1];
  39. }
  40. template<typename T>
  41. T pop(Stack<T>& s) {
  42.     T t = s.arr[--s.size];
  43.     if (s.size == 0) { delete[] s.arr; return t; }
  44.     T* tmp_arr = new T[s.size];
  45.     for (int i = 0; i < s.size; i++) tmp_arr[i] = s.arr[i];
  46.     delete[] s.arr;
  47.     s.arr = tmp_arr;
  48.     return t;
  49. }
  50. string inf2post(string n) {
  51.     string post;
  52.     Stack<char> op;
  53.     for (char el : n) {
  54.         if (isalnum(el)) post.push_back(el);
  55.         else if (el == '(') {
  56.             push(op, el);
  57.         }
  58.         else if (el == ')') {
  59.             while (!empty(op) && top(op) != '(') {
  60.                 post.push_back(pop(op));
  61.                 if (top(op) == '(') { pop(op); break; }
  62.             }
  63.         }
  64.         else {
  65.             if (empty(op) || top(op) == '(') push(op, el);
  66.             else if (privilege(el) > privilege(top(op))) { push(op, el); }
  67.             else {
  68.                 while (!empty(op) && top(op) != '(' && privilege(el) <= privilege(top(op))) {
  69.                     post.push_back(pop(op));
  70.                 }
  71.                 push(op, el);
  72.             }
  73.         }
  74.     }
  75.     while (!empty(op)) {
  76.         post.push_back(pop(op));
  77.     }
  78.     return post;
  79. }
  80.  
  81. int main() {
  82.     string q = inf2post("m/(n+k*p-x)*z^k");
  83.     cout << q;
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement