C++基础计算器III


假设我们有一个简单的表达式字符串,我们需要实现一个基础计算器来计算该表达式的值。表达式字符串可能包含括号、加号(+)或减号(-)、非负整数和空格。表达式字符串仅包含非负整数、+、-、*、/运算符、括号和空格。整数除法应向零取整。

例如,如果输入是 "6-4 / 2",则输出为 4

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

  • l1 := 0, l2 := 1

  • o1 := 1, o2 := 1

  • 定义一个栈 st

  • n := s 的大小

  • for i := 0 to n-1 do:

    • x := s[i]

    • if x >= '0' and x <= '9' then:

      • num := x - '0'

      • while (i + 1 < n and s[i + 1] >= '0' and s[i + 1] <= '9') do:

        • i := i + 1

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

      • l2 := (if o2 == 1 then l2 * num else l2 / num)

    • else if x == '(' then:

      • 将 l1 推入 st,将 o1 推入 st

      • 将 l2 推入 st,将 o2 推入 st

      • l1 := 0, o2 := 1

      • o1 := 1, l2 := 1

    • else if x == ')' then:

      • temp := l1 + o1 * l2

      • o2 := st 的栈顶元素

      • 从 st 中弹出栈顶元素

      • l2 := st 的栈顶元素

      • 从 st 中弹出栈顶元素

      • o1 := st 的栈顶元素

      • 从 st 中弹出栈顶元素

      • l1 := st 的栈顶元素

      • 从 st 中弹出栈顶元素

      • l2 := (if o2 == 1 then l2 * temp else l2 / temp)

    • else if x == '*' or x == '/' then:

      • o2 := (if x == '*' then 1 else -1)

    • else if x == '+' or x == '-' then:

      • if x == '-' and (i == 0 or (i - 1 >= 0 and s[i - 1] == '(')) then:

        • o1 := -1

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

      • l1 := l1 + o1 * l2

      • o1 := (if x == '+' then 1 else -1)

      • l2 := 1, o2 := 1

  • return 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

更新于:2020年7月11日

695 次浏览

开启您的职业生涯

通过完成课程获得认证

开始学习
广告