C ++中的Basic Calculator III

假设我们有一个简单的表达式字符串,并且我们必须实现一个基本的计算器来评估该表达式。表达式字符串可以包含开头和结尾括号,加号+或减号-,非负整数和空格。表达式字符串仅包含非负整数,+,-,*,/运算符,左括号和右括号以及空格。整数除法应截断为零。

因此,如果输入类似于“ 6-4 / 2”,则输出将为4

为了解决这个问题,我们将遵循以下步骤-

  • l1:= 0,l2:= 1

  • o1:= 1,o2:= 1

  • 定义一个堆栈st

  • n:= s的大小

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 如果x等于'-'并且(i等于0或(i-1> = 0且s [i-1]等于'('))),则-

    • l1:= l1 + o1 * l2

    • o1:=(如果x与'+'相同,则为1,否则为-1)

    • l2:= 1,o2:= 1

    • o1:= -1

    • 忽略以下部分,跳至下一个迭代

    • o2:=(如果x与'*'相同,则为1,否则为-1)

    • 温度:= l1 + o1 * l2

    • o2:= st的顶部元素

    • 从st删除元素

    • l2:= st的顶部元素

    • 从st删除元素

    • o1:= st的顶部元素

    • 从st删除元素

    • l1:= st的顶部元素

    • 从st删除元素

    • l2:=(如果o2与1相同,则l2 * temp,否则l2 / temp)

    • 将l1插入st,将o1插入st

    • 将l2插入st,将o2插入st

    • l1:= 0,o2:= 1

    • o1:= 1,l2:= 1

    • num:= x-'0'

    • 而(i + 1 <n和s [i + 1]> ='0'和s [i + 1] <='9'),则执行-

    • l2:=(如果o2与1相同,则l2 * num,否则为l2 / num)

    • (将i增加1)

    • num:=(num * 10)+(s [i]-'0')

    • x:= s [i]

    • 如果x> ='0'并且x <='9',则-

    • 否则,当x与'('相同时,则-

    • 否则,当x与')'相同时,则-

    • 否则,当x与'*'相同或x与'/'相同时,则-

    • 否则,当x与'+'相同或x与'-'相同时,则-

    • 返回l1 + o1 * l2

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
       public:
       int calculate(string s) {
          lli l1 = 0;
          lli l2 = 1;
          lli o1 = 1;
          lli o2 = 1;
          stack<lli> st;
          lli n = s.size();
          for (lli i = 0; i < n; i++) {
             char x = s[i];
             if (x >= '0' && x <= '9') {
                lli num = x - '0';
                while (i + 1 < n && s[i + 1] >= '0' && s[i + 1] <= '9') {
                   i++;
                   num = (num * 10) + (s[i] - '0');
                }
                l2 = (o2 == 1) ? l2 * num : l2 / num;
             }
             else if (x == '(') {
                st.push(l1);
                st.push(o1);
                st.push(l2);
                st.push(o2);
                l1 = 0;
                o2 = 1;
                o1 = 1;
                l2 = 1;
             }
             else if (x == ')') {
                lli temp = l1 + o1 * l2;
                o2 = st.top();
                st.pop();
                l2 = st.top();
                st.pop();
                o1 = st.top();
                st.pop();
                l1 = st.top();
                st.pop();
                l2 = (o2 == 1) ? l2 * temp : l2 / temp;
             }
             else if (x == '*' || x == '/') {
                o2 = (x == '*') ? 1 : -1;
             }
             else if (x == '+' || x == '-') {
                if (x == '-' && (i == 0 || (i - 1 >= 0 && s[i - 1] == '('))) {
                   o1 = -1;
                   continue;
                }
                l1 += o1 * l2;
                o1 = (x == '+') ? 1 : -1;
                l2 = 1;
                o2 = 1;
             }
          }
          return l1 + o1 * l2;
       }
    };
    main(){
       Solution ob;
       cout << (ob.calculate("(5+9*3)/8"));
    }

    输入值

    "(5+9*3)/8"

    输出结果

    4