LeetCode-224. 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.

题目:实现一个只有加减法的计算器,输入中包含小括号、正整数、空格,返回计算的结果

思路:考察栈的题目,int栈一个存放计算数和括号,char栈存放计算符号,空格不操作。具体来说,遍历s,如若s[i]是左括号则进栈,我定义MAX代替;如果是整数且栈为空或者栈顶元素为MAX,此时数字进栈,注意扫描s时,当出现数字时,需继续向后扫描以提取多位的整数;如果是整数而栈顶元素也是整数,则取出符号栈顶元素并进行计算,将计算结果重新入栈;如果是右括号,将数字栈连续出栈两次,并将括号里面的数字入栈并检验栈顶是否需要再次计算。最后返回数字栈顶即可。

代码:

#define MAX 10000000
class Solution {
public:
    int calculate(string s) {
        stack<char> sign;
        stack<int> number;
        int size = s.size();
        for(int i=0;i<size;i++){
        	if(s[i]=='(')
        		number.push(MAX); //左括号入数字栈,用MAX替代
        	else if(s[i]>='0'&&s[i]<='9'){ //出现数字,相后扫描获得完整数
        		int s_val=0; 
        		int j;
				for(j=i;s[j]>='0'&&s[j]<='9';j++){
					s_val = s_val*10+s[j]-'0';
				}
				i=j-1; //相后多位后,更新i的值
        		if(number.empty()||number.top()==MAX)
        			number.push(s_val);  //获得的整数入栈
        		else{                    //取出符号栈顶和数字栈顶进行计算
        			char op = sign.top();
        			sign.pop();
        			int val=0;
        			if(op=='+')
        			    val = number.top() + (s_val);	
					if(op=='-')
						val = number.top() - (s_val);
					number.pop();
					number.push(val);  //计算结果入栈
				}
			}
			else if(s[i]==')'){ //相当于去除一对括号
				int temp = number.top();
				number.pop();
				number.pop();
				if(!sign.empty()){ //通过符号栈是否为空来判断去除括号后是否需要继续进行计算
					char op = sign.top();
					sign.pop();
					int val=0;
					if(op=='+')
						val = number.top() + temp;
					if(op=='-')
						val = number.top() - temp;
					number.pop();
					number.push(val);
				}
				else
					number.push(temp);  //不需要计算时
			}
			else if(s[i]=='+'||s[i]=='-') //计算符号入栈
				sign.push(s[i]);
			else //空格不做处理
				;						
		}
		return number.top(); //最后只剩数字栈顶,返回即可
    }
};

AC,beats 99.6%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值