LeetCode224. Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

Example 1:

Input: "1 + 1"
Output: 2

Example 2:

Input: " 2-1 + 2 "
Output: 3

Example 3:

Input: "(1+(4+5+2)-3)+(6+8)"
Output: 23

Note:

  • You may assume that the given expression is always valid.
  • Do not use the eval built-in library function.

思路:

其实这道题最重要的一点就是需要处理好括号的问题,我们这里使用stack来处理括号的优先级问题,这里的处理方式很像第32题的处理。

解法1:

我们先处理输入中的括号,然后处理完括号后再处理比较简单的情况。

class Solution {
public:
	int calculate(string s) {
		string num;
		stack<string> ss;
		for (char a : s) {
			if (a == ' ') {
				if (num == "") continue;
				ss.push(num);
                num = "";
				continue;
			}
			else if (a == ')') {
				if (num != "") {
					ss.push(num);
					num = "";
				}
				list<string> inBracket;
				while (ss.top() != "(") {
					inBracket.push_front(ss.top());
					ss.pop();
				}
				ss.pop();
				int sum = calList(inBracket);
				ss.push(to_string(sum));
			}
			else if (a == '(' || a == '+' || a == '-') {
				if (num != "") {
					ss.push(num);
					num = "";
				}
				ss.push(string(1,a));
			}
			else  num += a;
		}
		if (num != "") {
			ss.push(num);
			num = "";
		}

		list<string> left;
		while (!ss.empty()) {
			left.push_front(ss.top());
			ss.pop();
		}
		int sum = calList(left);

		return sum;
	}
private:
	int calList(list<string> l) {
		bool positive = true;
		int sum = 0;
		for (string s : l) {
			if (s == "+") positive = true;
			else if (s == "-") positive = false;
			else {
				int num = stoi(s);
				if (positive) sum += num;
				else sum -= num;
			}
		}
		return sum;
	}
};

解法2:

我们这里使用两个stack来分别存放数字和符号,代码如下:

class Solution {
public:
    int calculate(string s) {
		stack<int> nums, opt;
		int sum = 0, sign = 1;
		for (int i = 0; i<int(s.size()); i++) {
			if (isdigit(s[i])) {
				string numS;
				while (isdigit(s[i]))
					numS += s[i++];
				i--;
				sum += sign * stoi(numS);
			}
			else if (s[i] == '(') {
				nums.push(sum);
				opt.push(sign);
				sum = 0; sign = 1;
			}
			else if (s[i] == '+') sign = 1;
			else if (s[i] == '-') sign = -1;
			else if (s[i] == ')') {
				sign = opt.top(); opt.pop();
				sum = sign * sum + nums.top(); nums.pop();
			}
		}
		return sum;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/89476601