表达式求值的递归写法

6 篇文章 0 订阅

递归形式的表达式写法:
!!!多理解 多写就会拉
这里写图片描述
这里写图片描述
这里写图片描述

把表达式拆分,
表达式:可以是一项,也可以是多项通过加减构成。
项:可以是一个因子,也可以是多个因子的乘除形式。
因子,整数或者加上括号的表达式构成。
递归都要有出口,本题中的出口是当数为一个数的时候。
/* 
 *题目描述:表达式求值(递归算法) 
        表达式:1、可以是一个项 
                2、也可以由多个项通过加减构成 
        项:1、项本身可以是一个因子 
            2、项也可以由若干个因子通过乘除组成 
        因子:1、因子本身可以是一个数字 
              2、因子也可以由表达式加上括号组成 
 */  
 #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 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;  
 }  
 int term_value()//读入一项的并且返回其值  
 {  
     int result = factor_value();//读入一个因子  
     while(true)  
     {  
         char op = cin.peek();//取出一个字符判断还有没有因子  
         if(op== '*'||op == '/')  
         {  
             cin.get();  
             int value = factor_value();//读入下一个因子  
             if(op == '*')  
                result *=value;  
             else  
                result /=value;  
         }  
         else  
            break;  
     }  
     return result;  
 }  
 int factor_value()//读入一个因子并返回值  
 {  
     int result = 0;  
     char c = cin.peek();//取出一个字符判断输入流中是一个因子还是一个整数  
     if( c =='(')  
     {  
         cin.get();//去掉左括号  
         result = expression_value();//读入表达式  
         cin.get();//去掉右括号  
     }  
     else//是一个数字  
     {  
         while(isdigit(c))//求出数字的值  
         {  
             result = 10 * result +c- '0';  
             cin.get();  
             c= cin.peek();  
         }  
     }  
     return result;  
 }  

浮点表达式题目链接
题目:
描述
求一个可以带括号的小学算术四则运算表达式的值

输入
一行,一个四则运算表达式。’*’表示乘法,’/’表示除法
输出
一行,该表达式的值,保留小数点后面两位
样例输入
输入样例1:
3.4
输入样例2:
7+8.3
输入样例3:
3+4.5*(7+2)(3)((3+4)(2+3.5)/(4+5))-34(7-(2+3))
样例输出
输出样例1:
3.40
输出样例2:
15.30
输出样例3:
454.75
my code:


#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
double expression_value();
double term_value();
double factor_value();
double expression_value(){
    double result=term_value();
    bool more=true;//看看输入流里面是不是有东西
    while(more){
        char op=cin.peek();//只查看缓冲区的字符而不读取它
        if(op=='+'||op=='-'){
             cin.get();
        double value=term_value();
        if(op=='+'){
            result+=value;
        }
        else{
            result-=value;
        }
        }
        else
            more=false;
    }
    return result;
}
double term_value(){
    //读入一项并返回其值{
    double result=factor_value();//读入一个因子
    bool more=true;
    while(more){
        char op=cin.peek();
        if(op=='*'||op=='/'){
                cin.get();
            double value=factor_value();
            if(op=='*'){
                result*=value;
            }
            else{
                result/=value;
            }
        }
        else
            more=false;
    }
    return result;
    }
double factor_value(){
    char op=cin.peek();
    double result=0;
    if(op=='('){
        cin.get();
         result=expression_value();
        cin.get();
       }
       else{
      scanf("%lf",&result);

      }
       return result;

}
int main()
{
    printf("%.2lf",expression_value());
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值