栈弹栈实现的是⼆叉树的中序遍历(左根右),⽽每次push⼊值的顺序是⼆叉树的前序遍历(根左右),所以该题可以⽤⼆叉树前序和中序转后序的⽅法做
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
vector<int> pre, in, post,value;
void postorder(int root,int start,int end){ //root表示根节点在前序序列的位置
if(start>end)return;
int i=start;
while(i<end&&in[i]!=pre[root]) i++;
postorder(root+1,start,i-1); //左递归,右递归,根结点压入
postorder(root+i-start+1,i+1,end);
post.push_back(pre[root]);
}
int main() {
int n;
cin>>n;
char str[5];
stack<int>s;
int key=0;
for(int i=0;i<2*n;i++){
scanf("%s",&str);
if(strlen(str)==4){
int num;
cin>>num;
value.push_back(num);
pre.push_back(key); //key表示在num在value数组中的下标,key每个不同,num可能相同
s.push(key++); //表示压入value的第key个数
}else{
in.push_back(s.top());
s.pop();
}
}
postorder(0,0,n-1);
printf("%d",value[post[0]]);
for(int i=1;i<n;i++)
printf(" %d",value[post[i]]);
return 0;
}