數據結構初探(一)棧與棧的應用


(一)在描述棧(stack)之前,我們先了解一下數據結構基礎概念:


1、數據(data)是對客觀事物的符號表示,數據元素(data element)是數據的基本單位,一個數據元素可由若干個數據項(data item)組成,數據項為數據的不可分割的最小單位數據對象(data object)是性質相同的數據元素的集合,是數據的一個子集。數據結構(data structure)是相互之間存在一種或多種特定關系的數據元素的集合。數據元素相互之間的關系稱為結構(structure)

2、根據數據元素之間關系不同特性,通常有下列四類基本結構:
(1.)集合 機構中的數據元素之間除了“同屬於一個集合”的關系外,別無其他關系;
(2.)線性結構 結構中的數據元素之間存在一個對一個的關系;
(3.)樹形結構 結構中的數據元素之間存在一個對多個的關系;
(4.)網狀結構或圖狀結構 機構中的數據元素之間存在多個對多個的關系。

3、描述數據元素之間的邏輯關系的結構稱為邏輯結構。數據機構在計算機中的表示(又稱映像)稱為數據的物理結構,又稱存儲結構。它包括數據元素的表示和關系的表示。
在計算機中,我們用一個由若干位最合起來形成的一個位串表示一個數據元素,通常稱這個位串位元素結點(node)

4、數據元素之間的關系在計算機中有兩種不同的表示方法:順序映像和非順序映像,並由此得到兩種不同的存儲機構:順序存儲機構鏈式存儲結構數據類型(data type)是和數據結構密切相關的一個概念,是一個值得集合和定義在這個集合上的一組操作的總稱。分為原子類型和結構類型。

5、抽象數據類型(Abstract Data Type,簡稱ADT是指一個數學模型以及定已在該模型上的一組操作:
(1.)原子類型(atomic data type)屬原子類型的變量的值是不可分解的;
(2.)固定聚合類型(fixed-aggregate data type)屬該類型的變量,其值由確定成分按某種結構組成;
(3.)可變聚合類型(variable-aggregate data type)構成該類型的變量其“值”的數目不確定。
6、多形數據類型(polymorphic data type)是指其值的成分不確定的數據類型。
算法(algorithm)是對特淡定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或多個操作。

(二)棧(stack)是一種重要的數據結構。從數據結構角度來看,棧也是線性表,其特殊性在於棧的基本操作是線性表操作的子集。所以還需要了解一些關於線性表的知識:


1、線形表是一種線性結構,線性結構的特點是:
(1.)存在唯一的一個被稱作“第一個”的數據元素;
(2.)存在唯一的一個被稱作“最后一個”的數據元素;
(3.)除第一個之外,集合的每個數據元素均只有一個前驅
(4.)除最后一個之外,集合的每個元素均只有一個后繼
2、線性表(linear_list)是最常用且最簡單的一種數據結構。簡言之,一個線性表是n個數據元素的有限序列。在稍復雜的線性表中,一個數據元素可以有若干個數據項(item)組成。在這種情況下,常把數據元素稱為記錄(record),含有大量記錄的線性表又稱文件(file)
3、線性表的鏈式存儲結構的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。因此,為了表示沒個數據元素與其后繼元素之間的邏輯關系,除了存儲其本身的信息外,還需存儲一個指示其直接后繼的信息。這兩部分信息組成數據元素的存儲映像,稱為結點(node)。它包括兩個域:其中存儲數據元素信息的域稱為數據域;存儲直接后繼存儲位置的域稱為指針域。指針域中存儲的信息稱作指針或鏈。
4、N個結點鏈結成一個鏈表,即為線性表的鏈式存儲結構。又由於此鏈表的每個結點中只包含一個指針域,故稱做線性鏈表或單鏈表循環鏈表(circular linked list)是另一種形式的鏈式存儲結構。它的特點是表中最后一個結點的指針域只想頭結點,整個鏈表形成一個環。雙向鏈表,可以雙向讀取數據元素的循環鏈表。

(三)棧和棧的應用:


1、棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂(top),相應的,表頭端稱為棧底(bottom)。不含元素的空表稱為空棧。它按照先進后出(last in first out)的原則進行,是一種LIFO結構的線性表。
2、棧的存儲表示方法:

(1.)順序棧,即棧的順序存儲結構是利用一組地址連續的存儲單元一次存放自棧底到棧頂的數據元素,同時附設指針top只是棧頂元素在順序棧中的位置。習慣上用top=0表示空棧,由於棧在使用過程中所需最大空間的大小很難估計,因此,一般來說,在初始化設空棧時不應限定棧的最大容量。所以可以先為棧分配一個基本容量,然后在應用過程中,當棧的空間不夠用時再逐段擴大。為此,設定兩個常量:STACK_INIT_SIZE(存儲空間初始分配量)STACKINCHREMENT(存儲空間分配增量)
(2.)棧的鏈式表示,與單鏈表和雙向鏈表十分相似,不在詳細描述。
3、棧的應用舉例:

(1.)數值轉換

將十進制數1348轉換為八進制數,采用了eclipse編輯器和stack模板:


結果為:

(2.)括號匹配的檢驗

輸入一個中括號和小括號組成的char數組,然后進行括號匹配檢驗:

結果為:

(3.)行編輯程序

輸入一個字符串,遇到字符‘#’時刪除前面的字符,遇到字符‘@’時刪除前面的字符:

結果為:

(4.)迷宮求解

分別用兩個stack記錄x,y坐標,即可。

(5.)運算符優先級

與(3.)非常相似,后面有時間再補充。

(6.)遞歸

主要有八皇后問題,Hanoi問題等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM