1. 程式人生 > >鏈表-破損的鍵盤 Uva 11988

鏈表-破損的鍵盤 Uva 11988

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