题意

  • 对给定的数学表达式,求解其值(包含括号,加减乘除,幂)

思路

  • 通过递归的方式,每次找到最后一个运算的运算符,然后递归处理该运算符的左边和右边,直到当前区间只有数字,然后将两个递归的结果按照符号处理即可

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int digit(int l,int r){
	int num=0;
	for(int i=l;i<=r;i++){
		num=num*10+s[i]-'0';
	}
	return num;
}
int calc(int l,int r){
	int kuo=0,pos1=-1,pos2=-1,pos3=-1;
	for(int i=l;i<=r;i++){
		if(s[i]=='(')kuo++;
		if(s[i]==')')kuo--;
		if(kuo<=0){
			if(s[i]=='+'||s[i]=='-')pos1=i;
			if(s[i]=='*'||s[i]=='/')pos2=i;
			if(s[i]=='^')pos3=i;            
		}
	}
	if(pos1==-1&&pos2==-1&&pos3==-1){
		if(kuo==0&&s[l]=='(')return calc(l+1,r-1);
		else if(kuo>0&&s[l]=='(')return calc(l+1,r);
		else if(kuo<0&&s[r]==')')return calc(l,r-1);
		else return digit(l,r);
	}
	if(pos1!=-1){
		if(s[pos1]=='+')return calc(l,pos1-1)+calc(pos1+1,r);
		else return calc(l,pos1-1)-calc(pos1+1,r);
	}
	else if(pos2!=-1){
		if(s[pos2]=='*')return calc(l,pos2-1)*calc(pos2+1,r);
		else return calc(l,pos2-1)/calc(pos2+1,r);
	}
	else if(pos3!=-1){
		return pow(calc(l,pos3-1),calc(pos3+1,r));
	}    
	return 0;
}
signed main(){
	cin>>s;
	printf("%lld",calc(0,s.size()-1));
	return 0;
}

PS

  • 此题写着确实费劲,应当过一段时间重温一下——2025.3.10