天天看點

表達式求值的代碼和思路

#表達式求值

今天給大家帶來一道比較難的題,表達式求值

題目

題目描述:

求一個可以帶括号的國小算術四則運算表達式的值。

輸入格式:

一行,一個四則運算表達式。’‘表示乘法,’/'表示除法

輸出格式:

一行,該表達式的值,保留小數點後面兩位

樣例輸入:

3+4.5(7+2)(3)((3+4)(2+3.5)/(4+5))-34(7-(2+3))

樣例輸出:

454.75

思路1

我們可以把一個中綴表達式改成字尾,這樣就可以忽略括号

話不多說,Python3代碼和C++代碼奉上:

#include<bits/stdc++.h>
using namespace std;
double factor_value();
double term_value();
double expression_value();
int main(){
	printf("%.02lf",expression_value());
	return 0;
}
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();
	while(true){
		char op=cin.peek();
		if(op=='*'||op=='/'){
			cin.get();
			double value=factor_value();
			if(op=='*')
			result*=value;
			else result/=value;
}
	else
	break;
}
	return result;
}
double factor_value(){
	double result=0;
	char c=cin.peek();
	if(c=='('){
		cin.get();
		result=expression_value();
		cin.get();
	}
	else{
		while(isdigit(c)){
			cin.get();	
			result=10*result+c-'0';
			c=cin.peek();
		}
	}
	return result;
}