给你一个字符串表达式 s ,实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
例如:s = "3+2*2/2"
对于计算式我们了解到乘除优先级高于加减,所以对于本题我们有一种思路:所有的加减我们可以转化成正负数,而乘除则相当于前面的正负数去*或/后面的数。
具体实现思路:
注意:初始化符号要为‘+’。
使用栈来解决,碰到加减运算,就转换成正负数依次存入栈中,遇到乘除运算,则分别使得栈的首元素*或/相应的值后替换原来的首元素,最后再将栈内的所有元素进行相加即可得出结果。注意所有的运算应该基于数据的运算,所以我们首先考虑的是数据的位数判断计算,而后再根据数据前面的符号进行相应的栈内数据操作,如此一来,总是在遍历到数据之后的符号时才对前面的数据进行操作,就带来一个问题最后一位数据后面没有符号,所以加了判断条件i == l - 1,至于s[i] != ' ',则是为了防止出现数据后有空格的情况。
进阶:后续的文章会给出一个完整功能计算器的实现,即遇到括号,判断前括号前面的符号若为负,则括号内的所有数据正负要相应变换,遇到幂运算,优先级又要高于乘除。
注:此题也可以用容器vector实现,差别在于容器存数据从末尾存入,取数据也是从末尾取出,运算也是末尾处进行运算,当然容器有一个更方便快捷的计算方法,相对于栈来说不用一一弹出数据,可以利用accumulate函数将容器内所有数据进行相加,提升运算速度。
int calculate(string s){
int i;
int l = s.size();
stack<int> stk;
long int number =0;
char sign ='+';
long int m =0;for(i =0; i < l; i++){if(isdigit(s[i])){
number = number *10+ s[i]-'0';}if(!isdigit(s[i])&& s[i]!=' '|| i == l -1){switch(sign){case'+':
stk.push(number);break;case'-':
stk.push(-number);break;case'*':
stk.top()= stk.top()* number;break;default:
stk.top()= stk.top()/ number;}
sign = s[i];
number =0;}}while(!stk.empty()){
m = m + stk.top();
stk.pop();}return m;}