简单四则运算
问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
示例
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6
int calculate(char *pstr){
/*
算法时间复杂度为O(n),
用到了辅助空间建立辅助栈,栈用的是STL中自带的stack
*/
stack<int> data;
stack<char> op;
char *p=pstr;
int sum=0;
while(*p!='\0'){
if(*p>='0'&&*p<='9'){
data.push(*p-'0');
if(op.top()=='*'||op.top()=='/'){
int num2=data.top();
data.pop();
int num1=data.top();
data.pop();
int sum=0;
if(op.top()=='*'){
sum=num1*num2;
}
if(op.top()=='/'){
sum=num1/num2;
}
data.push(sum);
op.pop();
}
}
else if(*p=='+'|| *p=='-' || *p=='*' || *p=='/'){
op.push(*p);
}
p++;
}
//由于栈是先进后出的,所以在处理完乘除之后,加减在符号栈中的运算顺序是相反的,需要再用个辅助栈颠倒过来
stack<int> data_temp;
stack<char> op_temp;
while(data.size()>0){
data_temp.push(data.top());
// cout<<data.top()<<" ";
data.pop();
}
while(op.size()>0){
op_temp.push(op.top());
//cout<<op.top()<<" ";
op.pop();
}
sum=0;
while(op_temp.size()>0){
int num1=data_temp.top();
data_temp.pop();
int num2=data_temp.top();
data_temp.pop();
if(op_temp.top()=='+'){
sum=num1+num2;
}
if(op_temp.top()=='-'){
sum=num1-num2;
}
data_temp.push(sum);
op_temp.pop();
}
return data_temp.top();
}