<学习笔记?> 链表

例题 : codevs 4650 破损的键盘

 

手打版

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int next[100010];
 9 char s[100010];
10 
11 int main()
12 {
13     while(scanf("%s",s)!=EOF)
14     {
15         memset(next,0,sizeof(next));
16         int l=strlen(s),first=100001,last=100001,k=first;
17         next[first]=-1;
18         for(int i=0;i<l;++i)
19         {
20             if(s[i]=='[')  k=first;
21             else if(s[i]==']')  k=last;
22             else {
23                      int p=next[k];
24                      next[k]=i;
25                      next[i]=p;
26                      k=i;
27                      if(p==-1) last=i;
28             }
29         }
30         for(int i=next[first];i!=-1;i=next[i])
31             printf("%c",s[i]);
32         printf("\n");
33     }
34     return 0;
35 }

 

Stl 版

 1 #include<iostream>
 2 #include<list> // 双端链表 
 3 using namespace std;
 4 
 5 string a;
 6 list<char> b;
 7 list<char>::iterator f;
 8 
 9 int main()
10 {
11     while(cin>>a)
12     {
13 
14         int l=a.length();f=b.begin();
15         for(int i=0;i<l;++i)
16         {
17             if(a[i]=='[') f=b.begin(); //把f移到链表头部
18             else if(a[i]==']') f=b.end(); //把f移到链表尾部
19             else  b.insert(f,a[i]);  // f会随着插入而后移 
20         }
21         while(!b.empty()) 
22         {
23             cout<<b.front();
24             b.pop_front();
25         }
26         cout<<'\n';
27     }
28     return 0;   
29 }
30 
31 //http://www.cplusplus.com/reference/list/list/insert/
32 //http://www.cplusplus.com/reference/list/list/push_back/ 

 

posted @ 2017-11-08 20:56  loi_maple  阅读(186)  评论(0编辑  收藏  举报