录制:CSP-JS_25暑期集训 日期:2025-08-14 18:41:08 录制文件:https://meeting.tencent.com/crm/2Oq6OQDkec

#include<bits/stdc++.h>
using namespace std;

char opt[300]; // 存运算符 
int val[300], idx = 0; // 存叶子节点值,idx是节点编号 
stack<int> stk;  // 辅助计算后缀表达式 
vector<int> tree[300]; // 邻接表,构建根与子树关系 
bool isleaf[300]; // 标记当前节点是否为叶子节点 

int dfs(int u)
{
	if (isleaf[u]) return val[u]; // 叶子节点直接返回值 
	if (opt[u] == '+') return dfs(tree[u][0]) + dfs(tree[u][1]); // 递归进行计算 
	if (opt[u] == '-') return dfs(tree[u][0]) - dfs(tree[u][1]);
	if (opt[u] == '*') return dfs(tree[u][0]) * dfs(tree[u][1]);
	if (opt[u] == '/') return dfs(tree[u][0]) / dfs(tree[u][1]);
}

int main()
{
	string s;
	getline(cin, s);
	for (int i = 0; i < s.size() - 1; i++) 
	{
		if (isdigit(s[i]))
		{
			int sum = 0;
			while (isdigit(s[i]))
			{
				sum = sum * 10 + s[i] - '0';
				i++;
			}
			int id = ++idx;
			val[id] = sum;  
			isleaf[id] = true;
			stk.push(id);  // 数字入栈 ,注意入栈的是编号,值在val[]中 
		}
		else // 遇到符号,弹出栈顶元素,以运算符为根构建子树,并讲根的编号重新入栈 
		{
			int id = ++idx;
			int b = stk.top(); stk.pop();
			int a = stk.top(); stk.pop();
			opt[id] = s[i];
			isleaf[id] = false;
			tree[id].push_back(a);
			tree[id].push_back(b);
			stk.push(id);
		}
	}
	int root = stk.top();
	cout << dfs(root);
	return 0;
}

0 条评论

目前还没有评论...

信息

ID
401
时间
1000ms
内存
256MiB
难度
10
标签
递交数
2
已通过
2
上传者