题目链接Expressions
如果不懂什么是后缀表达式构建表达树的
可以参考这篇文章https://blog.csdn.net/qq_26849233/article/details/72910010
题意:
给出一个后缀表达式,让你建成二叉树后,按照下至上,从右至左,将其输出
在建完树之后,按照层序输出然后在把式子反转即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
using namespace std;
const int maxn=11000;
struct node
{
char c;
int l,r;
}edge[maxn];
int cnt;
void solve(string & s)
{
//cout<<s.size()<<endl;
stack <int> sta;
for(int i = 0; i < s.size(); i++){
if(s[i] >= 'a'){
edge[cnt].c = s[i];
sta.push(cnt);
cnt++;
continue;
}
int r = sta.top();
sta.pop();
int l = sta.top();
sta.pop();
edge[cnt].c = s[i],edge[cnt].l = l,edge[cnt].r = r;
sta.push(cnt);
cnt++;
}
}
void output()
{
string ans;
//层序遍历
queue <int> q;
//cout<<cnt - 1<<endl;
q.push(cnt - 1);
while(!q.empty()){
int temp = q.front();
q.pop();
ans += edge[temp].c;
if(edge[temp].l){
q.push(edge[temp].l);
}
if(edge[temp].r){
q.push(edge[temp].r);
}
}
//反转
reverse(ans.begin(),ans.end());
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--){
string s;
cin>>s;
memset(edge,0,sizeof(edge));
cnt = 1;
solve(s);
output();
}
return 0;
}