- 后缀表达式的值
如何通过后缀表达式构建表达式树
- @ 2025-8-14 20:43:57
录制: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
- 上传者