基本计算器

在这里插入图片描述
解题思路:

把1-(5-2+3)+(6-2)转换为1-5+2-3+6-2,来处理。
在这里插入图片描述
1 初始化图中的变量

2 数字1前面是+号,所以sign=1,res=0+1=1;

3 遇到负号‘-’,sign=-1;

4 遇到左括号‘(’,将负号放入栈中,即-1压栈,目的是为了让括号里面的符号都变号;

5 遇到数字5,sign=-1,res+=sign*num,即res=1-5=-4;

6 遇到负号‘-’,sign=-op.top(),此时栈op的顶部是刚刚压入栈中的左括号前的符号‘-’,即-1,所以sign=1,也就是括号外是减号,去掉括号要变号;

以下按这个流程走下去,就可以计算出最终结果。

class Solution {
public:
    int calculate(string s) {
       stack<int> op; //存放符号
       op.push(1); //1代表+号,-1代表-号
       int sign=1; //sign是每个数字前面的符号
       int n=s.size(); //字符串长度

       int res=0; //记录结果
       int i=0; //记录当前位置

       while(i<n){
          if(s[i]==' '){
              i++;
          }else if(s[i]=='+'){
              sign=op.top();
              i++;
          }else if(s[i]=='-'){
              sign=-op.top();
              i++;
          }else if(s[i]=='('){
              op.push(sign); //把括号前的符号放进栈中
              i++;
          }else if(s[i]==')'){
              op.pop(); //弹出括号前的符号
              i++;
          }else{
              long num=0;
              while(i<n&&s[i]>='0'&&s[i]<='9'){
                  num=num*10+(s[i]-'0');
                  i++;
              }
              res+=sign*num;
          }
       }
       
       return res;

    }
};

在这里插入图片描述

class Solution {
public:
    int calculate(string s) {
       int n = s.size(), curRes = 0, res = 0;
       long num=0;
        char op = '+';
        for (int i = 0; i < n; ++i) {
            char c = s[i];
            if (c >= '0' && c <= '9') {
                num = num * 10 + c - '0';
            } else if (c == '(') {
                int j = i, cnt = 0;
                for (; i < n; ++i) {
                    if (s[i] == '(') ++cnt;
                    if (s[i] == ')') --cnt;
                    if (cnt == 0) break;
                }
                num = calculate(s.substr(j + 1, i - j - 1));
            }
            
            //遇到加减乘除号,先要处理前面的
            if (c == '+' || c == '-' || c == '*' || c == '/' || i == n - 1) {
                //先根据op的值对num进行分别的加减乘除的处理,结果保存到curRes中
                switch (op) {
                    case '+': curRes += num; break;
                    case '-': curRes -= num; break;
                    case '*': curRes *= num; break;
                    case '/': curRes /= num; break;
                }

                //假如当前字符是加或减或最后一个数了,把符号前面的结果加到res中
                if (c == '+' || c == '-' || i == n - 1) {
                    res += curRes;
                    curRes = 0;
                }

                //更新op、num,也就是下一次的运算符号
                op = c;
                num = 0;
            }
        }
        return res;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值