[leetcode] Basic Calculator II

From : https://leetcode.com/problems/basic-calculator-ii/

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

Solution 1:

先计算所有乘除法,再计算加减法。

class Solution {
public:
    int md(int left, char options, int right) {
	    switch(options) {
		    case '*':  return left * right;
		    case '/':  return left / right;
		    default :  return 0;
	    }
    }
    
    int calculate(string s) {
        int n = s.length();
	    if (n < 1) return 0;
	    int result = 0;
	    stack<int> value;
	    stack<char> options;
	    options.push('+'); //这样才能取出第一个用于加法的数字

	    for (int i = 0; i < n;) {
			if (s[i] == ' ') i++;
			else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
			    options.push(s[i]);
			    i++;
		    } else {
			    int right = 0;
			    while(i < n && s[i] <= '9' && s[i] >= '0') {
				    right = right*10 + s[i]-'0';
				    i++;
			    }
			    if (!options.empty() && (options.top() == '*' || options.top() == '/')) {
				    right = md(value.top(), options.top(), right);
				    value.pop();
				    options.pop();
			    }
			    value.push(right);
		    }
	    }

	    while (!options.empty()) {
		    int temp = value.top();
		    if (options.top() == '-') temp = -temp;
		    result += temp;
		    value.pop();
		    options.pop();
	    }
	    return result;
    }
};

Solution 2:

直接计算,节省空间。

class Solution {
public:
    int calculate(string s) {
		s = "0+0+0+"+s;
        int a=0, b=0, c=0, ans=0;
        char op1='+', op2='+';
        for(int i=5; op1!='.';) {
            if(op2!='.' && op1=='*' || op1=='/') {
                if(op1 == '*') {
                    a *= b;
                } else {
                    a /= b;
                }
                b = c;
                op1 = op2;
            } else if(op2=='*' || op2=='/') {
                if(op2 == '*') {
                    b *= c;
                } else {
                    b /= c;
                }
            } else {
                if(op1 == '+') {
                    a += b;
                } else if(op1 == '-'){
                    a -= b;
                } else if(op1 == '*') {
                    a *= b;
                } else {
                    a /= b;
                }
				b = c;
				op1 = op2;
            }
            findNext(s, i, op2, c);
        }
        return a;
    }
    void findNext(string& s, int &i, char& op, int &n) {
        op = '.';
        n = -1;
        for(int len=s.size(); i<len; i++) {
            if(s[i] != ' ') {
                if(s[i]>='0' && s[i]<='9') {
                    n = 0;
                    while(i<len && (s[i]==' ' || s[i]>='0' && s[i]<='9')) {
                        if(s[i] != ' ')	n = n*10+s[i]-'0';
                        i++;
                    }
					if(i<len && op=='.') {
						op=s[i];
						i++;
					}
                } else {
					if(i < len) op = s[i];
				}
            }
            if(n != -1 && op != '.') break;
        }
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值