表达式求值(递归)

题目描述:

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入:

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “ +” 和乘法运算符 “ *”,且没有括号, 所有参与运算的数字均为 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值