其他分享
首页 > 其他分享> > 表达式求值——递归

表达式求值——递归

作者:互联网

 

 

 

 

 

 

 

 下面是代码实现

#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();
        } 
    }
    result result;
}

 

这里一个一个函数进行解释:

1,第一个函数是功能是求出表达式的值并返回值。首先要先得到第一个项的值(上面的图有说了表达式的组成),接下来设计一个循环,在循环中取出输入流中的下一个元素看看是不是加或者减,cin.peek()函数是会得到第一个元素的返回值,但是不会将元素给取出来的,如果是的话进入if中,用cin.get()可以去掉输入流中的头一个元素。这个去掉的元素就是加号,然后呢把加号后面的项加到result里面去。如果不是加号或者减号就break掉。

2,第二个函数和第一个函数一样只是把加号和减号换成乘号和除号而已。

3,第三个函数是求因子的,因子有两种可能,第一中是左括号加上表达式加上右括号,第二种是数字的形式(前面有说到)。首先看第一种形式,还是一样把输入流中的第一个元素拿出来看,是不是左括号,如果是的话把左括号去掉算一个resul = 表达式,再把右括号去掉。如果是数字的话就设计一个循环把数字转成一个数。

 

标签:函数,递归,int,元素,括号,加号,求值,表达式
来源: https://www.cnblogs.com/chengzhangpeideboke/p/15860135.html