問題解決レポート-PAT-Tree Traversals Again(1086)
2562 ワード
問題解決レポート-PAT-Tree Traversals Again
Tree Traversals Againには2つの解題構想があります.
1.PushとPopの過程で後のシーケンスを記録する.2、先頭シーケンスと中間シーケンスを構築し、build後シーケンスを構築します.PAT原題リンク:https://www.patest.cn/contests/pat-a-practise/1086
次の2つのアルゴリズムを示します:アルゴリズム1:
アルゴリズム2:
Tree Traversals Againには2つの解題構想があります.
1.PushとPopの過程で後のシーケンスを記録する.2、先頭シーケンスと中間シーケンスを構築し、build後シーケンスを構築します.PAT原題リンク:https://www.patest.cn/contests/pat-a-practise/1086
次の2つのアルゴリズムを示します:アルゴリズム1:
# include
# include
# include
# define MAX 60
typedef struct stack{
int top;
int data[MAX];
int flag[MAX]; // 0. ,1. 。
}ST;
/**
:
, , , , 。
, :
1. , build(n,s1,s2,ans); 。
2. , Push Pop 。
s。
Push , , , 0, 。
Pop , , pop s , s 1,
, 。 1 pop 1 ,
。
Push: s push, 0
Pop: s pop 1 , , 0 , 。 1,
。
**/
ST s; //
int main(){
char str[10];
int t, n, ans[MAX], j=0;
cin >> n;
s.top = 0; // 0
for(int i = 0; i < MAX; i++){
s.flag[i] = 0;
}
for(int i = 0;i < 2*n; i++){
cin >> str;
if(strcmp(str,"Push") == 0){ // push
cin >> t;
s.data[s.top] = t;
s.flag[s.top++] = 0;
}else{ // pop
// 1
while(s.top!=0){
if(s.flag[s.top-1] == 1)
ans[j++] = s.data[--s.top];
else
break;
}
s.flag[s.top-1] = 1; // 1 。
}
}
while(s.top!=0) // ,
ans[j++] = s.data[--s.top];
for(int i=0;i
アルゴリズム2:
# include
# include
# include
# include
# define MAX 60
using namespace std;
stack s;
void build(int n,char *s1,char* s2,char *s){
if(n<=0) //
return;
int p=strchr(s2,s1[0]) - s2; // s1[0] s2
build(p,s1+1,s2,s);
build(n-p-1,s1+p+1,s2+p+1,s+p); // n-p-1
s[n-1]=s1[0];
}
int main(){
char str[5];
int s1[MAX],s2[MAX];
int j1=0,j2=0,t,n;
cin >> n;
for(int i=0;i<2*n;i++){
cin>>str;
if(strcmp(str,"Push") == 0){
cin>>t;
s.push(t);
s1[j1++] = t;
}else{
s2[j2++]=s.top();
s.pop();
}
}
char str1[MAX],str2[MAX],ans[MAX];
for(int i=0;i
アルゴリズム2はPATのコミットテストにおいて、N=30であり、複雑な組み合わせであり、テストポイント5は合格しなかった.後序研究を保留したり、原因を知っている人がいたら連絡してください.