例子:計算機計算算術表示式。
1.1 字尾表示式
字尾表示式策略:從左向右掃瞄,逐個處理運算數和運算符號。
計算機實現字尾表示式計算方法的資料結構稱為堆疊。
1.2 堆疊的抽象資料型別描述
堆疊(stack):具有一定操作約束的線性表。
1、型別名稱:堆疊
2、資料物件集:乙個有0個或者多個元素的有窮線性表。
3、操作集:長度為maxsize的堆疊s屬於stack,堆疊元素item屬於elementtype
2.1 棧的定義
# define maxsize 《儲存資料元素的最大個數》
typedef
struct snode *stack;
struct snode
;
2.2 入棧void
push
(stack ptrs, elementtype item)
else
}
2.3 出棧elementtype pop
(stack ptrs)
else
return
(ptrs->data[
(ptrs->top)--]
);}
2.4 陣列空間利用率的提公升
【思考】請用乙個陣列實現兩個堆疊,要求最大地利用陣列空間,使陣列只要有空間入棧操作就成功。
【分析】一種比較好的方法是使這兩個棧分別從陣列的兩頭開始向中間生長,當兩個棧的棧頂指標相遇時,表示兩個棧都滿了。
【棧的定義】
# define maxsize 《儲存資料元素的最大個數》
struct dstack s;
s.top1 =-1
;s.top2 = maxsize;
【入棧】
void
push
(struct dstack *ptrs, elementtype item,
int tag)
if(tag ==1)
ptrs->data[
++(ptrs->top1)
]= item;
else
ptrs->data[
--(ptrs->top2)
]= item;
}
【出棧】
elementtype pop
(struct dstack *ptrs,
int tag)
else
return ptrs->data[
(ptrs->top1)--]
;}else
else
return ptrs->data[
(ptrs->top2)++]
;}}
棧的鏈式儲存結構實際上就是乙個單鏈表,叫做鏈棧。插入和刪除操作只能在鏈棧的棧頂進行。
【注意】鏈棧的指標top只能指向鍊錶的鏈頭,不能指向鏈尾。
3.1 鏈棧的定義
typedef
struct snode *stack;
struct snode
;
3.2 初始化stack createstack()
intisempty
(stack s)
3.3 插入void
push
(elementtype item, stack s)
3.4 刪除elementtype pop
(stack s)
else
}
4.1 中綴表示式求值
基本策略:中綴表示式轉換為字尾表示式,然後求值。
4.2 中綴表示式轉換稱為字尾表示式
從頭到尾讀取中綴表示式的每個物件,對不同物件按不同的情況處理。
4.3 堆疊的其他應用
資料結構學習,堆
堆的定義 1 堆的物理結構是乙個連續的陣列 2 邏輯機構是乙個完全二叉樹,且所有的子節點都不大於父節點 3 分為大頂堆和小頂堆,大頂堆的定義是堆頂資料是最大的 下面自己實現的堆排序 package com.example.demo util 測試堆排序 author wym public class...
資料結構學習筆記 線性表
線性表是零個或多個資料元素的有限序列。線性表的資料物件集合為。其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每個元素有且只有乙個直接後繼元素。資料元素之間的關係是一對一的關係 線性表的順序儲存結構指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。簡單的說...
資料結構學習筆記
資料結構概述 定義我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構 儲存到主儲存器 記憶體 中,以及在此基礎上為實現某個功能 比如查詢摸個 元素,刪除某個元素,對所有元素進行排序 而執行的相應操作,這個相應 的操作也叫演算法 資料結構 個體 個體的關係 演算法 對儲存資料的操作 演算...