鍊錶的游標實現 一道演算法題

2021-08-04 08:50:10 字數 1483 閱讀 8356

輸入包含多組資料。每組資料佔一行,包含不超過100000個字母、下劃線、字元「[」或

者「]」。其中字元「[」表示home鍵,「]」表示end鍵。輸入結束標誌為檔案結束符(eof)。輸

入檔案不超過5mb。對於每組資料,輸出一行,即螢幕上的悲劇文字。

//樣例輸入:

this_is_a_[beiju]_text

//樣例輸出:

beijuthis_is_a__text

【分析】

最簡單的想法便是用陣列來儲存這段文字,然後用乙個變數pos儲存「游標位置」。這

樣,輸入乙個字元相當於在陣列中插入乙個字元(需要先把後面的字元全部右移,給新字元

騰出位置)。

很可惜,這樣的**會超時。為什麼?因為每輸入乙個字元都可能會引起大量字元移

動。在極端情況下,例如,2500000個a和「[」交替出現,則一共需要0+1+2+…+2499999=6*10 12次字符移動。**

解決方案是採用鍊錶(linked list)。每輸入乙個字元就把它存起來,設輸入字串是

s[1~n],則可以用next[i]表示在當前顯示屏中s[i]右邊的字元編號(即在s中的下標)(1)。

提示6-3:在陣列中頻繁移動元素是很低效的,如有可能,可以使用鍊錶。

為了方便起見,假設字串s的最前面還有乙個虛擬的s[0],則next[0]就可以表示顯示屏

最左邊的字元。再用乙個變數cur表示游標位置:即當前游標位於s[cur]的右邊。cur=0說明

游標位於「虛擬字元」s[0]的右邊,即顯示屏的最左邊。

對於這種游標的, 一般理解都是一步一步除錯, 從而慢慢了解思路

源**如下:

#include

#include

#include

const int maxn = 100000 + 5;

intlast, cur, next[maxn]; //游標位於cur號字元的後面

char s[maxn];

int main()

}

for(int i = next[0]; i != 0; i = next[i])

printf("%c", s[i]);

printf("\n");

} system("pause");

return

0; }

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...

一道演算法題

1.上午主要做了對翻譯任務的劃分,下午把 翻譯完畢。2.明天要講的演算法題 對乙個集合,求出其連續元素組成的子集中,和最大的子集 我對這道題的理解是 1 若集合中最小值大於0,意味著所有的都大於0,則最大的子集和,為所有值加起來 2 若集合中最大值小於0,意味著所有的都小於0,則最大的子集和,為集合...

一道演算法題

include using namespace std const int size 5 int max sub array const int a,int n,int m int max matrix const int a size int row,int col,int subsize int...