1.多型數據類型是指包含的數據元素的類型並不肯定。數組
好比棧能夠是整數棧、字符棧、對象棧等等。安全
可是字符串,它的元素必然是字符。ide
2.兩個長度不相同的串不可能相等。性能
先判斷長度是否相等,不相等則結果直接爲不相等;ui
長度相等才繼續判斷是否對應位置上的每一個字符串是否相等,若是全部對應位置字符都相等,結果爲相等,不然爲不相等。線程
3.在64位平臺機器下sizeof(string_a),sizeof(string_b)大小分別是對象
1.char *string_a=(char *)malloc(100*sizeof(char)); 8內存
2.char string_b[100]; 100字符串
串′ababaaababaa′的next數組爲011234223456。string
i 0 1 2 3 4 5 6 7 8 9 10 11
s a b a b a a a b a b a a
next[i] -1 0 0 1 2 3 1 1 2 3 4 5
先計算前綴next[i]的值: (字符串匹配是 從頭開始的 和 從尾開始的字符串進行匹配是否重複 )
next[i]的值主要是看s[i]以前的字符串中重複的子串長度。next[0] = -1,定值。
next[1]是看s[1]以前的字符串「a」中重複的子串長度爲0,故next[1] = 0。
next[2]是看s[2]以前的字符串「ab」中重複的子串長度爲0,故next[2] = 0。
next[3]是看s[3]以前的字符串"aba"中重複的子串長度,s[0]與s[2]重複,長度爲1,故next[3] = 1。
next[4]是看s[4]以前的字符串"abab"中重複的子串長度,s[01]與s[23]重複,長度爲2,故next[4] = 2。
next[5]是看s[5]以前的字符串"ababa"中重複的子串長度,s[012]與s[234]重複,長度爲3,故next[5] = 3。
next[6]是看s[6]以前的字符串"ababaa"中重複的子串長度,s[0]與s[5]重複(由於多了一個a,沒法找到長度爲3的重複字符串,
這隻能是s[0]和s[5]重複),長度爲1,故next[6] = 1。
一樣的,求next[7]和next[8]、next[9]、 next[10]、 next[11] 分別爲1和二、三、四、5。
next數組下標從1開始計算
next[1] 確定是 0
next[2] 確定是 1
next[n] 的狀況,將前面n-1個字符,計算從首尾開始組成最大的相同子串的長度,若是找到,那麼next值是該長度加1,不然next值是1。
舉例:
next[6]的計算,字符串第六位是 a ,( ababa a ababaa)
將前面的5個字符,從頭尾開始取4個組成子串比較,若是不相等,則從首尾取3個字符組成子串繼續比較,並以此類推,
若是一直比較到最後一個字符都不相等,那麼該next值爲1。
4個字符的狀況:abab : baba
3個字符的狀況:aba : aba 此時相等,那麼next[6] = 3+1 = 4
4.字符串www.qq.com全部非空子串(兩個子串若是內容相同則只算一個)個數是50
非空子串的個數共有n(n+1)/2=55個,因爲相同子串算一個,因此要減去2個w,一個.,一個ww,一個q,因此還有50個。
要求的是子串,從左到右一次截取, 10個字符的子串,1個; 9個字符的子串,2個;
8--------3個, 7---------4個, ......... 1-----------10個
共有:1+2+3+...+10=10*(10+1)/2=55
減去重複的: 1個字符時有3個w,2個q,2個. 2個字符時有2個ww 故應減去:(2+1+1+1)=5 答案:55-5=50。
5.設棧的初始狀態爲空,當字符序列a3_做爲棧的輸入時,輸出長度爲3的且能夠用做C語言標識符的字符串序列有3個。
分別是:a3_.a_3,_3a.
首先,棧的順序是先進後出
字符序列爲a3_ 1)a入棧,再出棧,而後3入棧,再出棧,—入棧,再出棧 序列是a3_
2)a入棧,再出棧,而後3,—入棧,再出棧,序列是a_3
3)a入棧,3入棧,再出棧,a出棧, —入棧,再出棧 序列是3a_
4) a入棧,3入棧,再出棧, —入棧,序列是3_a
5) a入棧,3入棧,_入棧,序列是_3a
其次,C語言的標識符不能以數字開頭,去除3a_和3_a 答案爲3。
6.String str = new String(「abc」),「abc」在內存中的分配是堆,字符串常量區。
當你new String("abc")時,其實會先在字符串常量區生成一個abc的對象,而後new String()時會在堆中分配空間,
而後此時會把字符串常量區中abc複製一個給堆中的String,故abc應該在堆中和字符串常量區。
7."abc"+"def"則會建立三個字符串對象,第三個是"abcdef"。也就是說,在Java中對字符串的一切操做,都會產生一個新的字符串對象。
StringBuffer是線程安全的,它比String快。 一、三者執行速度:StringBuilder > StringBuffer > String ;
二、StringBuilder:線程非安全的;
三、StringBuffer:線程安全的;
四、用String操做字符串時,其實是在不斷地建立新對象,而原來的對象會做爲垃圾被回收;
(1)String建立字符串是不可變的,任何對String的改變都會引起新的String對象的生成;
(2)StringBuffer是可變的,任何對它所指代的字符串的改變都不會產生新的對象; 因此,當改變字符串的內容時,StringBuffer能得到更好的性能;
(3)StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高;
8.中綴表達式(a+b)*c*(d-e/f) 轉成後綴 ab+c*def/-*。
中綴表達式轉後綴表達式的方法:
1.遇到操做數:直接輸出(添加到後綴表達式中)
2.棧爲空時,遇到運算符,直接入棧
3.遇到左括號:將其入棧
4.遇到右括號:執行出棧操做,並將出棧的元素輸出,直到彈出棧的是左括號,括號不輸出。
5.遇到其餘運算符:加減乘除:彈出全部優先級大於或者等於該運算符的棧頂元素,而後將該運算符入棧
6.最終將棧中的元素依次出棧,輸出。
9.串是一種特殊的線性表,其特殊性體如今數據元素是一個字符.
串就是字符串,是一種特殊的線性表,它的每一個結點僅由一個字符組成。
串值也可用鏈表來存儲,因爲串的數據元素是一個字符,它只有8位二進制數, 所以用鏈表存儲時,一般一個結點中存放的不是一個字符,而是一個子串,例如: 在編輯系統中,整個文本編輯區能夠當作是一個串,每一行是一個子串,構成一個結點。
10.字符串一般採用的兩種存儲方式是順序存儲和鏈式存儲.
順序存儲和鏈式存儲時兩種最基本的存儲結構,字符串一般採用順序存儲,可是字符串較長而沒有那麼大的連續空間時,能夠把一個字符串分紅多個小串,串與串之間採用鏈式存儲.
11.串的長度:串中字符數目 n 稱爲串的長度;串長度是指串中全部字符的個數。
零個字符的串稱爲空串,長度爲零。
12.在C語音中有:
string 和 int 型都支持直接加減
'C'+'8'-'3'= 'C'+'5',因爲'C'+1='D',因此結果爲char 'H' => %c;
‘9’-‘0’:平時寫代碼的時候常常int(0~9)轉換char就用的+'0',所以結果直接就是int 9 => %d。