今天其實講了另外的東西,但我沒聽懂,所以不寫了,把昨天的內容補一補,今天的之後自己體悟一下再來總結......
首先佇列:「先進先出」資料訪問
佇列顧名思義就像排隊一樣
更形象一點,就像只能容納乙個人的獨木橋
佇列是一種「先進先出」的容器
先存進佇列的元素比後進佇列的元素先取出
必須在先進佇列的元素取出後,後入隊的元素才可以取出
所以佇列用於訪問情況為「先進先出」的場景問題的資料訪問。
比如解決提到的過獨木橋的順序問題,以及排隊問題等。顯然,bfs過程中的村塾也是用佇列的思想
特點:1.資料存在乙個 陣列,陣列的大小即佇列容量大小
2.用兩個變數head和tail分別記錄隊首資料下標-1和隊尾資料下標
3.以陣列形式存放乙個佇列(int q[maxsize];)
4.隊空時head=tail
5.隊滿時tail=maxsize-1(注意:和tail-head無關)
6.head為隊首元素的下標-1.通過訪問q[head+1]取隊首元素。tail為隊尾元素下標
給出乙個容量為5的佇列的例子:
將元素進,出佇列:
1.訪問當前隊首的元素:q[head++]
2.新的元素x入佇列:++tail;q[tail]=x;
3.隊首元素出佇列:++head;
然而,這很浪費空間,10哥元素,逐個入隊,再逐個出隊,再逐個入隊,如此重複10000遍,所需空間就很大
隊首出隊只是隊首下標+1,假裝刪除了隊首,而實際上並沒有真正釋放空間
所以,改進!
普通的佇列vs環形佇列:
普通佇列vs雙端佇列:
接下來堆:
堆就是乙個「父親值比兒子值大」或「父親值比兒子值小」的完全二叉樹
堆實際上時乙個序列,它滿足條件:
當i=1,2,...,n/2時,k[i]<=k[2i]且k[i]<=k[2i+1];或
當i=1,2,...,n/2時,k[i]>=k[2i+1]且k[i]>=k[2i+1];
堆按照父親和兒子數值的比較關係可分為「大根堆」和「小根堆」兩種
堆在取序列最值功能上有出色的表現,
在已經生成好的堆上取序列最值操作的複雜度o(1),修改乙個生成好的堆上的資料
的複雜度為o(logn),初始化生成乙個堆也值需要o(nlogn)的時間
因此,堆很適合頻繁地查詢序列中的最大值的問題
去最值:
依照定義,堆結構種的第乙個元素即最值
所以,要去堆h中的最值,直接訪問h[1]即可獲得,相當簡單
調整:
建堆:
[code]
viod build()
刪除隊首元素:
[code]
void delete()
}插入新元素:
[code]
void insert(int key)
{int x=++n;
while(x>1)
{ if(keyok,結束
福州培訓之資料結構 鍊錶,棧 (2月7日)
今天呢,換了個老師講,大部分都聽懂了,可能是內容比較簡單的原因吧 首先,怎麼學寫程式 程式 programming 資料結構 data structure 演算法 algorithm 沒有天生前後順序關係的 陣列 記錄乙個元素的後乙個元素 反向鍊錶,雙向鍊錶,迴圈鍊錶等 特點 1.資料存在陣列裡 2...
資料結構(8)之堆
1.堆排序定義 n個關鍵字序列kl,k2,kn稱為堆,當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k2i且ki k2i 1或 2 ki k2i且ki k2i 1 1 i 若將此序列所儲存的向量r 1.n 看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹 樹中任一非葉結點的...
大話資料結構8之棧和佇列2
棧的應用 四則運算表示式求值 字尾 逆波蘭 表示法定義 不需要括號的字尾表示式。例 9 3 1 3 10 2,字尾表示式為9 3 1 3 10 2 所有的符號都是在要運算的數字後面出現 字尾表示式計算結果 還是上例 1 初始化乙個空棧,此棧用於對要運算的數字進出使用 2 字尾表示式中的前三個都是數字...