LeetCode224. Basic Calculator

本文介绍了一种不使用内置eval函数实现基本计算器的方法,用于评估简单的表达式字符串,涵盖加减运算及括号优先级处理。提供了两种解决方案,一种使用单个栈处理括号和运算,另一种使用两个栈分别处理数字和符号。

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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值