表达式树求助!求条玄关
查看原帖
表达式树求助!求条玄关
997236
theb0t楼主2024/9/29 22:07

树构建错了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
char s[100005];
int son[100005][2],ans[100005];
int stk1[100005],stk2[100005];
int top1,top2;
void build()
{
	int x=stk1[top1--];
	son[x][0]=stk2[top2-1];
	son[x][1]=stk2[top2];
	stk2[--top2]=x;
}
void dfs(int x)
{
	if(isdigit(s[x])) return;
	dfs(son[x][0]),dfs(son[x][1]);
	if(s[x]=='+') ans[x]=ans[son[x][0]]+ans[son[x][1]];
	if(s[x]=='*') ans[x]=ans[son[x][0]]*ans[son[x][1]];
}
void print(int x)
{
	cout<<s[x]<<' '<<son[x][0]<<' '<<son[x][1]<<'\n';
	print(son[x][0]);
	print(son[x][1]);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>(s+1);
	int n=strlen(s+1);
	s[0]='(',s[n+1]=')';
	for(int i=0;i<=n+1;i++)
	{
		if(s[i]=='+')
		{
			if(s[stk1[top1]]=='*') build();
			stk1[++top1]=i;
		}
		if(s[i]=='*')
		{
			if(s[stk1[top1]]=='*') build();
			stk1[++top1]=i;
		}
		if(s[i]=='(') stk1[++top1]=i;
		if(s[i]==')')
		{
			if(s[stk1[top1]]=='*') build();
			if(s[stk1[top1]]=='+') build();
			top1--;
		}
	}
//	print(stk2[1]);
//	return 0;
	dfs(stk2[1]);
	cout<<ans[stk2[1]]<<'\n';
	return 0;
}

2024/9/29 22:07
加载中...