1. 程式人生 > >表示式求值的遞迴寫法

表示式求值的遞迴寫法

遞迴形式的表示式寫法:
!!!多理解 多寫就會拉
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

把表示式拆分,
表示式:可以是一項,也可以是多項通過加減構成。
項:可以是一個因子,也可以是多個因子的乘除形式。
因子,整數或者加上括號的表示式構成。
遞迴都要有出口,本題中的出口是當數為一個數的時候。
/* 
 *題目描述:表示式求值(遞迴演算法) 
        表示式: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;
}

這裡寫圖片描述