十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
for index,val := range a {
目前成都創(chuàng)新互聯(lián)已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、延津網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
if val == '好' {
fmt.println(index,x)
}
}
對(duì)string做range得到的val是int32類型,直接用單引號(hào)比較就行
圖例如下:
結(jié)果應(yīng)該是分別是:
廣度優(yōu)先: a - b - c - d - f - e - g
先序遍歷: a - b - d - e - f - g - c
中序遍歷: e - d - b - g - f - a - c
后序遍歷: e - d - g - f - b - c - a
結(jié)果存在result里面,如果不存可以少一層變量
這個(gè)地方強(qiáng)烈建議讀一下下面的第一個(gè)鏈接,我遵照著那篇文章實(shí)現(xiàn)的,只是用Go改寫了而已。
首先定義一個(gè)數(shù)據(jù)結(jié)構(gòu),用來存儲(chǔ)一些Node的信息。
這里是可以運(yùn)行的,但是總會(huì)拋出一個(gè)數(shù)組越界的錯(cuò)誤,我看了半天也沒看出來哪里有問題,Mac版的devel我這邊又有bug,沒用起來。至少思路對(duì)了,我后面再看一下哪里的問題。(感謝 @RiXu 指正)
2021-11-10
列表是一種非連續(xù)的存儲(chǔ)容器,有多個(gè)節(jié)點(diǎn)組成,節(jié)點(diǎn)通過一些變量記錄彼此之間的關(guān)系
單鏈表和雙鏈表就是列表的兩種方法。
原理:A、B、C三個(gè)人,B懂A的電話,C懂B的電話只是單方知道號(hào)碼,這樣就形成了一個(gè)單鏈表結(jié)構(gòu)。
如果C把自己的號(hào)碼給B,B把自己的號(hào)碼給A,因?yàn)槭请p方都知道對(duì)方的號(hào)碼,這樣就形成了一個(gè)雙鏈表結(jié)構(gòu)
如果B換號(hào)碼了,他需要通知AC,把自己的號(hào)碼刪了,這個(gè)過程就是列表的刪除操作。
在Go語言中,列表使用 container/list 包來實(shí)現(xiàn),內(nèi)部的實(shí)現(xiàn)原理是雙鏈表,列表能夠高效地進(jìn)行任意位置的元素插入和刪除操作。
列表初始化的兩種辦法
列表沒有給出具體的元素類型的限制,所以列表的元素可以是任意類型的,
例如給列表中放入了一個(gè) interface{} 類型的值,取出值后,如果要將 interface{} 轉(zhuǎn)換為其他類型將會(huì)發(fā)生宕機(jī)。
雙鏈表支持從隊(duì)列前方或后方插入元素,分別對(duì)應(yīng)的方法是 PushFront 和 PushBack。
列表插入函數(shù)的返回值會(huì)提供一個(gè) *list.Element 結(jié)構(gòu),這個(gè)結(jié)構(gòu)記錄著列表元素的值以及與其他節(jié)點(diǎn)之間的關(guān)系等信息,從列表中刪除元素時(shí),需要用到這個(gè)結(jié)構(gòu)進(jìn)行快速刪除。
遍歷完也能看到最后的結(jié)果
學(xué)習(xí)地址:
先來看一個(gè)簡(jiǎn)單的例子
輸出的結(jié)果為:
從上面例子中可以看出,string是以byte數(shù)組形式存儲(chǔ)的,而一個(gè)utf8格式的中文占3個(gè)byte.要得到正確的中文字符的長(zhǎng)度和分割,可以使用 rune 數(shù)組來拆分. rune類型是int32的別名,一個(gè)rune可以表示一個(gè)中文字符,go也提供了rune數(shù)組自動(dòng)拆分string中文字符的方法 rt := []rune(str) .
我們?cè)侔焉厦胬有薷囊幌拢?/p>
得到的輸出結(jié)果為:
這樣就能比較好的處理中文了,而且不會(huì)出現(xiàn)亂碼的情況.
#include iostream
#include string.h
using namespace std;
void main()
{
char *p[3] ={"HELLO","5465465","go132HOME"}, str[100];
int i, j, k;
for(i = 0; i 3; i++)
cout p[i] endl;
cout endl;
for(i = 0; i 3; i++)
{
for(k = 0; k 100; k++) str[k] = '\0';
for(k=0;*(p[i]+k);k++)
str[k] = *(p[i]+k);
for(j = 0; str[j]; j++)
{
if(str[j] = 65 str[j] = 90) {str[j] = str[j] + 32;cout str[j];continue;}
if(str[j] = 97 str[j] = 122) {str[j] = str[j] - 32;cout str[j];continue;}
cout str[j];
}
cout endl;
}
}
又:
/*用指針數(shù)組方式定義3個(gè)字符串,然后遍歷每個(gè)字符串,把里面的小寫字母改大寫,大些字母改小寫。 */
#include iostream
#include string.h
using namespace std;
void main()
{
char *p[3] ={"HELLO","5465465","go132HOME"}, str[100];
int i, j, k;
for(i = 0; i 3; i++)
cout p[i] endl;
cout endl;
for(i = 0; i 3; i++)
{
for(k = 0; k 100; k++) str[k] = '\0';
for(k=0;*(p[i]+k);k++)
str[k] = *(p[i]+k);
for(j = 0; str[j]; j++)
{
if(str[j] = 65 str[j] = 90) {str[j] = str[j] + 32;goto flag;}
if(str[j] = 97 str[j] = 122) {str[j] = str[j] - 32;goto flag;}
flag: cout str[j];
}
cout endl;
}
}
注意:用指針數(shù)組不能直接改
即不能用 *p = *p + 32;
否則出現(xiàn)錯(cuò)誤: unhandled exception 0xC0000005
對(duì)于切片的順序遍歷,一般使用 range 就可以了。
這里有一個(gè)問題需要注意一下,如果這里的切片nums不是基本數(shù)據(jù)類型而是結(jié)構(gòu)體。range遍歷出來的value值是拷貝值而并非原結(jié)構(gòu)體,修改value中的值不會(huì)改變?cè)衅械闹?。如果要遍歷修改,可以將切片的結(jié)構(gòu)體改為指針,或都索引來取值。
一般情況下逆序遍歷思路就是for size-1到0.
二般的也可以使用range來遍歷