链表-破损的键盘 Uva 11988
Posted 123123123gg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表-破损的键盘 Uva 11988相关的知识,希望对你有一定的参考价值。
#include<cstdio> #include<cstring> const int maxn=100000+5; int last,cur,next[maxn]; char s[maxn]; int main() { while(scanf("%s",s+1)==1) { int n=strlen(s+1); last=cur=0; for(int i=1;i<=n;i++) { char ch=s[i]; if(ch==‘[‘) cur=0; else if(ch==‘]‘) cur=last; else { next[i]=next[cur]; next[cur]=i; if(cur==last) last=i; cur=i; } } for(int i=next[0];i!=0;i=next[i]) printf("%c",s[i]); printf(" "); } return 0; }
for(int i=next[0];i!=0;i=next;) 用数组模拟链表
cur代表当前字符的位置,也就是说它在光标的左边,i代表下一个字符 next[i]=next[cur];是把下一个字符的位置赋值为0,next[cur]=i;是把cur与i链接起来,cur->i; 在没有"["或者"]"出现的时候,last在cur的前面,也就是当前字符的前面,所以当 s[i]是"["是,last保存着它前一个字符的位置,当出现"]"时,last=cur又让cur回到了那个位置,然后cur又与i链接。
以这个输入为例。
ABC[DE]F
首先在ABC的时候,是按顺序链接的 0->1->2->3 当遇到‘[‘时,cur=0;所以 next[5]=next[0]; next[0]=5;这样 顺序就变成了 0->5->1->2->3; 然后到E这个字符,同样 next[6]=next[5];next[5]=6; 这样 顺序变成了 0->5->6->1->2->3; 然后到‘]‘ 这时候 cur=last=3; 然后到了F; next[9]=next[3]; next[3]=9; 这样 最后的顺序为 0->5->6->1->2->3->9;
以上是关于链表-破损的键盘 Uva 11988的主要内容,如果未能解决你的问题,请参考以下文章
例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard,UVa 11988)—静态链表