den4ik2003

Untitled

Oct 29th, 2023
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. bool delim (char c) {
  8.     return c == ' ';
  9. }
  10.  
  11. bool is_op (char c) {
  12.     return c=='+' || c=='-' || c=='*' || c=='/' || c=='%';
  13. }
  14.  
  15. int priority (char op) {
  16.     return
  17.         op == '+' || op == '-' ? 1 :
  18.         op == '*' || op == '/' || op == '%' ? 2 :
  19.         -1;
  20. }
  21.  
  22. void process_op (vector<int> & st, char op) {
  23.     int r = st.back();  st.pop_back();
  24.     int l = st.back();  st.pop_back();
  25.     switch (op) {
  26.         case '+':  st.push_back (l + r);  break;
  27.         case '-':  st.push_back (l - r);  break;
  28.         case '*':  st.push_back (l * r);  break;
  29.         case '/':  st.push_back (l / r);  break;
  30.         case '%':  st.push_back (l % r);  break;
  31.     }
  32. }
  33.  
  34. int calc (string & s) {
  35.     vector<int> st;
  36.     vector<char> op;
  37.     for (size_t i=0; i<s.length(); ++i)
  38.         if (!delim (s[i]))
  39.             if (s[i] == '(')
  40.                 op.push_back ('(');
  41.             else if (s[i] == ')') {
  42.                 while (op.back() != '(')
  43.                     process_op (st, op.back()),  op.pop_back();
  44.                 op.pop_back();
  45.             }
  46.             else if (is_op (s[i])) {
  47.                 char curop = s[i];
  48.                 while (!op.empty() && priority(op.back()) >= priority(s[i]))
  49.                     process_op (st, op.back()),  op.pop_back();
  50.                 op.push_back (curop);
  51.             }
  52.             else {
  53.                 string operand;
  54.                 while (i < s.length() && isalnum (s[i]))
  55.                     operand += s[i++];
  56.                 --i;
  57.                 if (isdigit (operand[0]))
  58.                     st.push_back (atoi (operand.c_str()));
  59.                 else
  60.                     st.push_back (stoi(operand));
  61.             }
  62.     while (!op.empty())
  63.         process_op (st, op.back()),  op.pop_back();
  64.     return st.back();
  65. }
  66.  
  67. int main() {
  68.   std::string s("1+(3*3+2)");
  69.   int x = calc(s);
  70.   std::cout << x;
  71. }
Add Comment
Please, Sign In to add comment