题目
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
3.1、表达式只含 +, -, *, / 四则运算符,不含括号
3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3.3、要考虑加减乘除按通常四则运算规定的计算优先级
3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
3.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
思路
题目要求很简单,只是计算个位数的四则运算,且没有括号。主要考察栈的运用,实现时采用两个辅助栈,一个用来存放操作数,一个用来存放运算符。根据操作符的优先级进行计算。
两个数组分别存储操作数和操作符,扫描输入的字符串,当遇到*和/的时候,边计算边存储,将计算结果存到操作数的数组中,当遇到+和-号时只存储不计算。当所有数据存储完毕后,因为运算就只剩下+-运算了.
代码
/*---------------------------------------
* 日期:2015-07-07
* 作者:SJF0115
* 题目:简单四则运算
* 来源:华为机试真题
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
// 简单四则运算
int calculate(string str){
int size = str.size();
if(size == 0){
return 0;
}//if
// 数字栈
stack<int> num;
// 运算符栈
stack<char> op;
for(int i = 0;i < size;++i){
// 数字
if(str[i] >= '0' && str[i] <= '9'){
num.push(str[i] - '0');
}//if
// 运算符 加减
else if(str[i] == '+' || str[i] == '-'){
op.push(str[i]);
}//else
// 运算符 乘除
else{
char o = str[i];
int a = num.top();
num.pop();
int b = str[++i] - '0';
if(o == '*'){
num.push(a * b);
}//if
else if(o == '/'){
num.push(a / b);
}//else
}//else
}//for
// 加减操作
while(!op.empty()){
char o = op.top();
op.pop();
int a = num.top();
num.pop();
int b = num.top();
num.pop();
if(o == '+'){
num.push(a + b);
}//if
else if(o == '-'){
num.push(b-a);
}//else
}//while
return num.top();
}
int main(){
string str;
//freopen("C:\\Users\\Administrator\\Desktop\\acm.txt","r",stdin);
while(cin>>str){
cout<<calculate(str)<<endl;
}//while
return 0;
}