摘要:棧底是固定的,而棧頂浮動的如果棧中元素個數(shù)為零則被稱為空棧。入棧將數(shù)據(jù)保存到棧頂。鏈棧鏈棧是指棧的鏈?zhǔn)酱鎯Y(jié)構(gòu),是沒有附加頭節(jié)點的運算受限的單鏈表,棧頂指針是鏈表的頭指針。
一、喜歡單挑線性表 1.線性表的特性
線性表是一個線性結(jié)構(gòu),它是一個含有n≥0個節(jié)點的有限序列。在節(jié)點中,有且僅有一個開始節(jié)點沒有前驅(qū)并有一個后繼節(jié)點,有且僅有一個終端節(jié)點沒有后繼并有一個前驅(qū)節(jié)點。其他的節(jié)點都有且僅有一個前驅(qū)和一個后繼節(jié)點。通??梢园岩粋€線性表表示成一個線性序列:k1,k2,…,kn,其中k1是開始節(jié)點,kn是終端節(jié)點。
1.1 線性結(jié)構(gòu)的特征在編程領(lǐng)域中,線性結(jié)構(gòu)具有如下兩個基本特征。
(1)集合中必存在唯一的一個“第一元素”和唯一的一個“最后元素”;
(2)除最后一個元素之外,均有唯一的后繼(后件)和唯一的前驅(qū)(前件);
由n(n≥0)個數(shù)據(jù)元素(節(jié)點)a1,a2,…,an組成的有限序列,數(shù)據(jù)元素的個數(shù)n定義為表的長度。當(dāng)n=0時稱為空表,我們通常將非空的線性表(n>0)記作:
(a1,a2,…an)
數(shù)據(jù)元素ai(1≦i≦n)沒有特殊含義,大家不必去“剖根問底”的研究它,它只是一個抽象的符號,其具體含義在不同的情況下可以不同。
線性表雖然只是一對一的單挑,但是其操作功能非常強大,具備了很多操作技能。
1.3 線性表的結(jié)構(gòu)特點均勻性:雖然不同數(shù)據(jù)表的數(shù)據(jù)元素是各種各樣的,但同一線性表的各數(shù)據(jù)元素必須有相同的類型和長度;
有序性:各數(shù)據(jù)元素在線性表中的位置只取決于它們的序。數(shù)據(jù)元素之前的相對位置是線性的,即存在唯一的“第一個”和“最后一個”的數(shù)據(jù)元素,除了第一個和最后一個外,其他元素前面只有一個數(shù)據(jù)元素直接前趨,后面只有一個直接后繼二、
在現(xiàn)實應(yīng)用中,有兩種實現(xiàn)線性表數(shù)據(jù)元素存儲功能的方法,分別是順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)。順序表操作是最簡單的操作線性表的方法,此方式的主要操作功能如下所示。
(1)計算順序表的長度
(2)清空操作
(3)判斷線性表是否為空
(4)判斷順序表是否為滿
(5)附加操作
(6)插入操作
(7)刪除操作
(8)獲取表元
(9)按值進(jìn)行查找
鏈比順序表要復(fù)雜一點,對于同一個數(shù)據(jù),它可以和不相鄰的數(shù)據(jù)發(fā)生關(guān)系。例如農(nóng)民通常將收獲的水果賣給商販,商販將收購的水果賣給加工廠。這是一條水果加工產(chǎn)業(yè)鏈,可以得出商販?zhǔn)寝r(nóng)民的財神、加工廠是商販的財神這一論調(diào)。在那一年的某一天,老實的農(nóng)民發(fā)現(xiàn)利潤較低,于是拉著自己的水果不遠(yuǎn)萬里的親自賣給了加工廠。這樣農(nóng)民伯伯獲得了更大的利潤,而商販也不能怎么著,這個產(chǎn)業(yè)鏈還得繼續(xù)下去。
由此可見,鏈?zhǔn)酱鎯Y(jié)構(gòu)不需要用地址連續(xù)的存儲單元來實現(xiàn),而是通過“鏈”建立起數(shù)據(jù)元素之間的次序關(guān)系。所以它不要求邏輯上相鄰的兩個數(shù)據(jù)元素在物理結(jié)構(gòu)上也相鄰,在插入和刪除時無需移動元素就而提高了運行效率。鏈?zhǔn)酱鎯Y(jié)構(gòu)主要有單鏈表、循環(huán)鏈表、雙向鏈表、靜態(tài)鏈表等幾種形式。
隊列和棧一樣,只允許在斷點處插入和刪除元素,循環(huán)隊的入隊算法如下所示。
(1)tail=tail+1;
(2)如果tail=n+1,則tail=1;
(3)如果head=tai,即尾指針與頭指針重合,則表示元素已裝滿隊列,會施行上溢出錯處理;否則Q(tail)=X,結(jié)束整個過程,其中X表示新入出元素。
使用C語言定義鏈隊列的格式如下所示。
typedef struct QNode{ ElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front; /* 隊頭指針,指向頭元素 */ QueuePtr rear; /* 隊尾指針,指向隊尾元素 */ }LinkQueue;3.隊列的基本操作
(1)初始化隊列Q的目的是創(chuàng)建一個隊列
(2)入隊的目的是將一個新元素添加到隊尾,相當(dāng)于到隊列最后排隊等候。
(3)出隊的目的是取出隊頭的元素,并同時刪除該元素,使后一個元素成為隊頭。
(4)獲取隊列第1個元素,即將隊頭的元素取出,不刪除該元素,隊頭仍然是該元素。
(5)判斷隊列Q是否為空
當(dāng)使用鏈?zhǔn)酱鎯Y(jié)構(gòu)表示隊列時,需要設(shè)置隊頭指針和隊尾指針,這樣做的好處是可以設(shè)置隊頭指的針和隊尾的指針。在入隊時需要執(zhí)行如下三條語句。
s->next=NULL; rear->next=s; rear=s;
在C語言中,實現(xiàn)隊列鏈?zhǔn)酱鎯Y(jié)構(gòu)類型的代碼如下所示。
type struct linklist { //鏈?zhǔn)疥犃械墓?jié)點結(jié)構(gòu) Elemtype Entry; //隊列的數(shù)據(jù)元素類型 struct linklist *next; //指向后繼節(jié)點的指針 }LINKLIST; typedef struct queue{ //鏈?zhǔn)疥犃?LINKLIST *front; //隊頭指針 LINKLIST *rear; //隊尾指針 }QUEUE;三、后進(jìn)先出的棧 1.什么是棧
棧允許在同一端進(jìn)行插入和刪除操作,允許進(jìn)行插入和刪除操作的一端稱為棧頂(top),另一端稱為棧底(bottom)。棧底是固定的,而棧頂浮動的;如果棧中元素個數(shù)為零則被稱為空棧。插入操作一般被稱為進(jìn)棧(PUSH),刪除操作一般被稱為退棧(POP)。
在棧中有兩種基本操作,分別是入棧和出棧。
(1)入棧(Push)
將數(shù)據(jù)保存到棧頂。在進(jìn)行入棧操作前,先修改棧頂指針,使其向上移一個元素位置,然后將數(shù)據(jù)保存到棧頂指針?biāo)傅奈恢?。入棧(Push)操作的算法如下:
①如果TOP≥n,則給出溢出信息,作出錯處理。在進(jìn)棧前首先檢查棧是否已滿,如果滿則溢出;不滿則進(jìn)入下一步驟②;
②設(shè)置TOP=TOP+1,使棧指針加1,指向進(jìn)棧地址;
③S(TOP)=X,結(jié)束操作,X為新進(jìn)棧的元素。
(2)出棧(Pop)
將棧頂?shù)臄?shù)據(jù)彈出,然后修改棧頂指針,使其指向棧中的下一個元素。出棧(Pop)操作的算法如下:
①如果TOP≤0,則輸出下溢信息,并實現(xiàn)出錯處理。在退棧之前先檢查是否已為空棧,如果是空則下溢信息,如果不空則進(jìn)入下一步驟②;
②X=S(TOP),退棧后的元素賦給X;
③TOP=TOP-1,結(jié)束操作,棧指針減1,指向棧頂。
順序棧是棧的順序存儲結(jié)構(gòu)的簡稱,它是一個運算受限的順序表。假設(shè)S是SeqStack類型的指針變量,如果棧底位置在向量的低端,則S->data[0]是棧底元素。
2.2鏈棧鏈棧是指棧的鏈?zhǔn)酱鎯Y(jié)構(gòu),是沒有附加頭節(jié)點的、運算受限的單鏈表,棧頂指針是鏈表的頭指針。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21853.html
摘要:奇妙的記憶點不穩(wěn)定內(nèi)排序基本思想分為兩步建堆與維持堆的性質(zhì)首先我們要先理解堆是什么東西堆其實就是一個完全二叉樹我們可以使用順序表存儲一個二叉樹如下圖所示來存儲其中分為最大堆最小堆而最大堆就是上頭大下頭小最小堆則反之明白了堆的定義我們就可以開 奇妙的記憶點: 不穩(wěn)定 內(nèi)排序 基本思想: 分為兩步,建堆與維持堆的性質(zhì),首先我們要先理解堆是什么東西.堆其實就是一個完全二叉樹,我們可以使用...
摘要:相反深度學(xué)習(xí)的對抗樣本是由于模型的線性特征。所以通過對抗訓(xùn)練能夠提高深度學(xué)習(xí)的對于對抗樣本的抗干擾能力。此外,指出,人類并不會像現(xiàn)代機器學(xué)習(xí)算法那樣被對抗樣本所影響。 2006 年,Geoffrey Hinton 提出了深度學(xué)習(xí)。受益于大數(shù)據(jù)的出現(xiàn)和大規(guī)模計算能力的提升,深度學(xué)習(xí)已然成為最活躍的計算機研究領(lǐng)域之一。深度學(xué)習(xí)的多層非線性結(jié)構(gòu)使其具備強大的特征表達(dá)能力和對復(fù)雜任務(wù)的建模能力。最近...
摘要:數(shù)據(jù)結(jié)構(gòu)程序數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu)基本概念數(shù)據(jù)的邏輯結(jié)構(gòu)反映數(shù)據(jù)元素之間的關(guān)系的數(shù)據(jù)元素集合的表示。這兩部分信息組成數(shù)據(jù)元素的存儲映象,稱為結(jié)點。 本文涉及更多的是概念,代碼部分請參考之前寫過的 2 篇博客 基于 Javascript 的排序算法 基于 javascript 的基本數(shù)據(jù)結(jié)構(gòu)和查找算法 本文主要是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法概念,可能部分地方會涉及更高級的算法和算法,具體內(nèi)容以...
摘要:不能用于機器學(xué)習(xí)太慢幻覺矩陣操作太難有函數(shù)庫啊,比如只能用于前端開發(fā)開發(fā)者笑了機器學(xué)習(xí)庫都是開發(fā)者機器學(xué)習(xí)庫神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)自然語言處理卷積神經(jīng)網(wǎng)絡(luò)一系列庫神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)我們將使用來實現(xiàn)線性回歸,源代碼在倉庫。 譯者按: AI時代,不會機器學(xué)習(xí)的JavaScript開發(fā)者不是好的前端工程師。 原文: Machine Learning with JavaScript : Part 1 ...
閱讀 1028·2021-09-26 09:55
閱讀 3591·2021-09-24 10:30
閱讀 1377·2021-09-08 09:36
閱讀 2558·2021-09-07 09:58
閱讀 610·2019-08-30 15:56
閱讀 776·2019-08-29 18:32
閱讀 3630·2019-08-29 15:13
閱讀 1848·2019-08-29 13:49