实现一个基本的计算器来计算一个简单的字符串表达式。
字符串表达式仅包含非负整数,+, - ,*,/四种运算符和空格 。 整数除法仅保留整数部分。
你可以假定所给定的表达式总是有效的。
一些例子:
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5
注意: 不要使用eval 内置的函数库。
详见:https://leetcode.com/problems/basic-calculator-ii/description/
Java实现:
class Solution { public int calculate(String s) { if(s == null || s.length() == 0){ return -1; } char sign = '+'; int cur = 0; Stack<Integer> stk = new Stack<Integer>(); for(int i = 0; i<s.length(); i++){ char c=s.charAt(i); if(Character.isDigit(c)){ cur = cur*10 + c-'0'; } if((!Character.isDigit(c) && c!=' ') || i==s.length()-1){ if(sign == '-'){ stk.push(-cur); }else if(sign == '+'){ stk.push(cur); }else if(sign == '*'){ stk.push(stk.pop()*cur); }else if(sign == '/'){ stk.push(stk.pop()/cur); } sign = c; cur = 0; } } int res = 0; for(int num : stk){ res += num; } return res; } }
C++实现:
class Solution { public: int calculate(string s) { int size=s.size(); if(size==0||s.empty()) { return 0; } int res=0,d=0; char sign='+'; stack<int> stk; for(int i=0;i<size;++i) { if(s[i]>='0') { d=d*10+s[i]-'0'; } if(s[i]<'0'&&s[i]!=' '||i==size-1) { if(sign=='+') { stk.push(d); } if(sign=='-') { stk.push(-d); } if(sign=='*'||sign=='/') { int tmp=sign=='*'?stk.top()*d:stk.top()/d; stk.pop(); stk.push(tmp); } sign=s[i]; d=0; } } while(!stk.empty()) { res+=stk.top(); stk.pop(); } return res; } };
参考:https://www.cnblogs.com/grandyang/p/4601208.html