鏈表-破損的鍵盤 Uva 11988
阿新 • • 發佈:2018-10-17
str pan 數組模擬鏈表 光標 while i++ 鏈表 字符 clas
#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("\n"); }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