题目描述:
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入:
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “ +” 和乘法运算符 “ *”,且没有括号, 所有参与运算的数字均为 0 到 231-1 之间的整数。 输入数据保证这一行只有 0~ 9、 +、 * 这 12 种字符。
样例:
【输入样例 1】 1+1*3+4 【输入样例 2】 1+1234567890*1 【输入样例 3】 1+1000000003*1
【输出样例 1】8【输出样例 2】 7891【输出样例 3】4
解题思想:
表达式是一个递归的定义:
表达式是由若干项相加或相减得来的,而一个项是由若干因子相乘或相除的得来的。因子可以是一个整数构成,也可以由括号括起来的表达式。如表达式:(2+3)*(5+7)+9/3;(2+3)*(5+7)是一个项,这个项由两个因子构成,其中因子又为表达式构成。9/3也是由两个因子构成,不过这两个因子由整数构成。
这样就构成了一个递归。
code:
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int factor_value();
int term_value();
int expression_value();
int main()
{
cout<<expression_value()<<endl;
return 0;
}
//因子
int factor_value(){
int result = 0;
char c = cin.peek();
if (c == '('){
//说明是一个表达式
cin.get(); //去掉左括号
result = expression_value();
cin.get();//去掉右括号
}else{
//c是一个数字的最高位
//isdigit看一个字符是否是数字
while(isdigit(c)){
result = 10 * result + c - '0';
cin.get();
c = cin.peek();
}
}
return result;
}
//一项
int term_value(){
int result = factor_value();//求第一个因子的值
bool more = true;
while(more){
char op = cin.peek();
if(op == '*'|| op == '/'){
cin.get();
int value = factor_value();
if(op == '*') result *= value;
else result /= value;
}
else more = false;
}
return result;
}
//表达式
int expression_value(){
int result = term_value();//求第一项的值
bool more = true;
while(more){
char op = cin.peek();//看第一个字符,不取走
if(op == '+'|| op == '-'){
cin.get(); //从输入取走一个字符
int value = term_value();
if(op == '+') result += value;
else result -= value;
}
else more = false;
}
return result;
}