版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章
學(xué)時(shí):6學(xué)時(shí)
3.1棧(Stack)3.2隊(duì)列(Queue)
1.定義L定義
2.邏輯結(jié)構(gòu)2.邏輯結(jié)構(gòu)
3.存儲(chǔ)結(jié)構(gòu)3.存儲(chǔ)結(jié)構(gòu)
4.運(yùn)算規(guī)則4.運(yùn)算規(guī)則
5.實(shí)現(xiàn)方式5.實(shí)現(xiàn)方式
本章主要介紹以下內(nèi)容:
1、棧的概念、存儲(chǔ)結(jié)構(gòu)及其基本操作
2、隊(duì)列的概念、存儲(chǔ)結(jié)構(gòu)及其基本操作
3、棧與隊(duì)列的應(yīng)用舉例
本章重點(diǎn)難點(diǎn):
1、棧的存儲(chǔ)結(jié)構(gòu)、特點(diǎn)、基本操作算法實(shí)現(xiàn)、以
及棧在遞歸算法實(shí)現(xiàn)中的應(yīng)用。
2、隊(duì)列存儲(chǔ)結(jié)構(gòu)、特點(diǎn)、基本操作、算法實(shí)現(xiàn)
、循環(huán)隊(duì)列及其應(yīng)用。
棧是僅在表尾進(jìn)行插入、刪除操作的線(xiàn)性表。
表尾(即an端)稱(chēng)為考頂/top;表頭(即ai端)稱(chēng)為戈底/base
從棧頂刪除最后一
想一想:要從棧中取出ai,個(gè)元素的操作,稱(chēng)
應(yīng)當(dāng)如何操作?出棧。
問(wèn)題1:堆棧是什么?它與一般線(xiàn)性表有什么不同?
堆棧是一種特殊的線(xiàn)性表,它只能在表的一端(即
棧頂)進(jìn)行插入和刪除運(yùn)算。
一般線(xiàn)性表堆棧
邏輯結(jié)構(gòu):1:1邏輯結(jié)構(gòu):1:1
存儲(chǔ)結(jié)構(gòu):順序表、鏈表存儲(chǔ)結(jié)構(gòu):順序棧、鏈棧
“出”=刪除=彈出=POP(a,
棧不存在的條件:base=NULL;
棧為空的條件:base=top;
棧滿(mǎn)的條件:top-base=stacksize;
問(wèn)題:什么叫“向上生成”的棧?
“向下生成”是如何生成的?
若入棧動(dòng)作使地址向高端增長(zhǎng),稱(chēng)為“向上生成”的棧;
若入棧動(dòng)作使地址向低端增長(zhǎng),稱(chēng)為“向下生成”的棧;
對(duì)于向上生成的堆棧:
入??谠E:堆棧指針top“先壓后加”:S[top++]=an+l
出??谠E:堆棧指針top“先減后彈":e=S[-top]
問(wèn)題3:為什么要設(shè)計(jì)堆棧?
它有什么獨(dú)特用途?
1.調(diào)用函數(shù)或子程序非它莫屬;
2.遞歸運(yùn)算的有力工具;
3.用于保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng);
4.簡(jiǎn)化了程序設(shè)計(jì)的問(wèn)題。
下面用3個(gè)例子來(lái)幫助理解堆棧:
例1.一個(gè)棧的輸入序列為1,2,3,若在入棧的過(guò)程中允許出
棧,則可能得到的出棧序列是什么?
答:可以通過(guò)窮舉所有可能性來(lái)求解:
①1入1出,2入2出,3入3出,即123;
②1入1出,2、3入,3、2出,即132;
③1、2入,2出,3入3出,即231;
④1、2入,2、1出,3入3出,即213;
⑤1、2、3入,3、2、1出,即321;
合計(jì)有5種可能性。
例2:一個(gè)棧的輸入序列是12345,若在入棧的過(guò)程中允
許出棧,則棧的輸出序列43512可能實(shí)現(xiàn)嗎?12345的輸
出呢?
答:
43512不可能實(shí)現(xiàn),主要是其中的12順序不能實(shí)現(xiàn);
12345的輸出可以實(shí)現(xiàn),每壓入一數(shù)便立即彈出即。
思考:有無(wú)通用的判別原則?
例3:設(shè)依次進(jìn)入一個(gè)棧的元素序列為c,a,b,d,
則可得到出棧的元素序列是:
A)a,b,c,dB)c,d,a,b
C)b,ad,aD)a,c,d,b
答:A)、D)可以,B)、C)不行。
討論:有無(wú)通用的判別原則?
有!若輸入序列…,Pj…Pk…Pj…(Pj<Pk<Pj
一定不存在這樣的輸出序列…,P匕叫…Pk…
本節(jié)重點(diǎn):順序棧和鏈棧的基本操作
棧的抽象數(shù)據(jù)類(lèi)型定義:
ADTStack{
數(shù)據(jù)對(duì)象:D=
數(shù)據(jù)關(guān)系:R=
入棧、出棧、
基本操作:建棧初始化、
判斷棧滿(mǎn)或棧空、
讀棧頂元素值等。
}ADTStack
順序棧的存儲(chǔ)表示(教材P46):
#defineSTACK-INIT-SIZE/Jo//存儲(chǔ)空間初始分配量
#defineSTACKINCREMENT10//存儲(chǔ)空間分配增量
typedefstruct{
SElemType*base;//棧的基址即棧底指針
SElemType*top;//棧頂指針
intstacksize;//當(dāng)前分配的空間
}SqStack;
順序棧的入棧操作——例如用堆棧存放(A,B,C,D)
Push(D);
順序棧出棧操作——例如從棧中取出B
鏈棧的入棧操作和出棧操作(教材省略)
棧也可以用鏈?zhǔn)浇Y(jié)構(gòu)來(lái)表示,用鏈?zhǔn)浇Y(jié)構(gòu)來(lái)表示的棧就是鏈棧
(1)鏈棧的構(gòu)造方式以頭指針為棧頂,在頭指針處插入或刪除
datanext鏈棧中每個(gè)結(jié)點(diǎn)由兩個(gè)域構(gòu)成:
data域和next域,其定義為:
typedefStructSNode{
SElemTypedata;
StructSNode*next;
}Node;
Node*st,*p;
intm=sizeof(Node);
(2)操作
鏈棧
入棧
函數(shù)
鏈棧
出棧
函數(shù)
例3表達(dá)式求值(這是棧應(yīng)用的典型例子)
這里,表達(dá)式求值的算法是“算符優(yōu)先法”。
例如:編寫(xiě)算法,用棧實(shí)現(xiàn)表達(dá)式3*(7-2)求值。
一個(gè)算術(shù)表達(dá)式是由
操作數(shù)(x,y,z…)和
算符(*,/,+,(,
(1)表達(dá)式求值必須滿(mǎn)足算術(shù)四則運(yùn)算規(guī)則:
a.從左算到右
b.先乘除,后加減
c.先括號(hào)內(nèi),后括號(hào)外
為了實(shí)現(xiàn)算符優(yōu)先算法,可以設(shè)定兩個(gè)工作棧,
OPND—存放操作數(shù)或運(yùn)算結(jié)果,OPTR—存放運(yùn)算符號(hào)。
(2)算法思想:
1)首先置操作數(shù)棧OPND為空棧,表達(dá)式的起始符#為運(yùn)算
符棧OPTR的棧底元素;
2)依次讀入表達(dá)式中的每個(gè)字符,
若運(yùn)算符是‘產(chǎn)或棧頂是結(jié)束計(jì)算,返回OPND棧頂
值。
if(是操作數(shù))一貝”P(pán)USH(OPND,操作數(shù));
if(是運(yùn)算符)一則與OPTR棧頂元素進(jìn)行比較,按優(yōu)
的噌以挪篆達(dá)式求值完畢(當(dāng)前讀入的字符和OPTR
棧的棧頂元素均為#)
表達(dá)式求值過(guò)程的描述:3*(7-2)
OPTROPNDINPUTOPERATE
#3*(7?2)#Push(opnd,,3,)
#3*(7-2)#Push(optr,'*')
禮*3(7-2)#Push(optr,'(')
37-2)#Push(opnd,,7,)
3,7-2)#Push(optr,'-')
#,*,(「3,72)#Push(opnd,,2,)
#,*,(「3,7,2)#Operate(7-2)
#,*,(3,5)#Pop(optr)
禮*3,5#Operate?*5)
#15#GetTop(opnd)
例4漢諾(Hanoi)塔問(wèn)題
移動(dòng)時(shí)的規(guī)則:x
?:?每次只能移動(dòng)一個(gè)盤(pán)子;]
只能小盤(pán)子在大盤(pán)子上面;|
可以使用任一柱子。心
分析:
設(shè)三根柱子分別為X,y,Z,盤(pán)子在X柱上,要移到Z柱上。
1、當(dāng)n=l時(shí),盤(pán)子直接從x柱移到z柱上;
2、當(dāng)n>l時(shí),則:
①設(shè)法將前n-1個(gè)盤(pán)子從x移到y(tǒng)柱上(借助z),則盤(pán)
子n就能從x移到z柱上;
②再設(shè)法把n-1個(gè)盤(pán)子從y移到z柱上(這又是一個(gè)與原來(lái)
相同的問(wèn)題,只是規(guī)模少1了)。
設(shè)計(jì)如下:
VoidHanoi(intn,charx,chary,charz)
{//將n個(gè)編號(hào)從上至(下為L(zhǎng).?n的盤(pán)子從x柱,借助y柱移到z柱
if(n==1)
move(x,1,z);//將編號(hào)為1的盤(pán)子從x柱移到z柱
else{//將nT個(gè)編號(hào)從上到下為1…n-1的盤(pán)子從x柱,借助y
柱移到z柱
Hanoi(n-1,x,z,y);
move(x,n,z);//修編號(hào)為11的盤(pán)子從*柱移到2柱
//將nT個(gè)編號(hào)從上到下為l...n-l的盤(pán)子從y柱,借助x柱
Hanoi(n-1,y,x9z);
32隊(duì)列
隊(duì)列的定義限制在一端插入、在另一端刪除的線(xiàn)性表
稱(chēng)為一個(gè)隊(duì)列。插入端稱(chēng)為隊(duì)尾,刪除端稱(chēng)為隊(duì)首。
分別用一個(gè)“隊(duì)頭指針”和一個(gè)“隊(duì)尾指針”指向隊(duì)
首和隊(duì)尾。
a2
隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)及算法實(shí)現(xiàn)
?順序隊(duì)列:用連續(xù)的空間區(qū)域存放一個(gè)
隊(duì)列,設(shè)置兩個(gè)指針?lè)謩e指向隊(duì)頭合隊(duì)
尾。
■循環(huán)隊(duì)列:為解決順序隊(duì)列中的溢出現(xiàn)
象而設(shè)置的頭尾連接的隊(duì)列。
?鏈?zhǔn)疥?duì)列:每個(gè)元素定義成一個(gè)結(jié)點(diǎn),
含兩個(gè)域:其中數(shù)據(jù)域:存放結(jié)點(diǎn)數(shù)據(jù),
順序隊(duì)列:
4-1圖顯示順序表入隊(duì)出隊(duì)的過(guò)程:
從示意圖中可以看到,隨著入隊(duì)、出隊(duì)操作的進(jìn)行,
整個(gè)隊(duì)列會(huì)整體向后移動(dòng),這樣就出現(xiàn)了圖4-1(d)
中的現(xiàn)象:隊(duì)尾指針雖然已經(jīng)移到了最后,而隊(duì)列卻
未真滿(mǎn)的“假溢出”現(xiàn)象,使得隊(duì)列的空間沒(méi)有得到
有效的利用。
rear=9
圖4」
Rcdl1
front="l
(a)
(b)
2.循環(huán)隊(duì)列
為了解決上述隊(duì)列的“假溢出”現(xiàn)象,要做移
動(dòng)操作,當(dāng)移動(dòng)數(shù)據(jù)較多時(shí)將會(huì)影響隊(duì)列的操
作速度。一個(gè)更有效的方法是將隊(duì)列的數(shù)據(jù)區(qū)
Q:0?.MAXLEN-1]看成是首尾相連的環(huán),即將
表示隊(duì)首的元素Q[0]與表示隊(duì)尾的元素
Q[MAXLEN-L]連接起來(lái),形成一個(gè)環(huán)形表,這
就成了循環(huán)隊(duì)列,如圖(4-2)所示。
循環(huán)隊(duì)列示意圖
MAXSIZE-1
front14-2循環(huán)隊(duì)
歹U
上圖是假設(shè)長(zhǎng)度為10的循環(huán)隊(duì)列操作示意圖。
因?yàn)槭穷^尾相接的循環(huán)結(jié)構(gòu),所以將入隊(duì)時(shí)的隊(duì)尾指
針加1操作修改為:
p->rear=(p->rear+l)%MAXLEN;
將出隊(duì)時(shí)的隊(duì)頭指針加1操作修改為:
p->front=(p->front+l)%MAXLEN;
在圖4-4(a)中,此時(shí)front=4,rear=8,隊(duì)列中具
有:@6、a7、a8>@9四個(gè)元素;
隨著@『@15相繼入隊(duì),此時(shí)front=4,rear=4,隊(duì)
列已滿(mǎn),如(b)所示,可見(jiàn)在隊(duì)滿(mǎn)情況下有:
front==rear0
若在(a)的情況下,@6?ag相繼出隊(duì),此時(shí)隊(duì)空,
front=8,rear=8,如(c)所示,也有:front二
二rear,也就是說(shuō),僅根據(jù)等式front二二rear無(wú)法有
效判別是“隊(duì)滿(mǎn)”還是“隊(duì)空
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年北京市初三二模道德與法治試題匯編:與世界緊相連
- 美妝店零售送貨服務(wù)協(xié)議
- 兒童樂(lè)園裝修材料采購(gòu)合同
- 醫(yī)藥物流服務(wù)承攬合同模板
- 農(nóng)業(yè)機(jī)械包船運(yùn)輸合同樣本
- 家具城裝修購(gòu)銷(xiāo)合同樣本
- 主題餐廳室內(nèi)裝修材料訂購(gòu)
- 體育館看臺(tái)墻面裝修協(xié)議
- 住宅小區(qū)石材裝修協(xié)議
- 地震監(jiān)測(cè)砂石運(yùn)輸承包
- 中國(guó)移動(dòng)室分問(wèn)題排查優(yōu)化指導(dǎo)手冊(cè)
- 老年人法律援助與維權(quán)服務(wù)體系建設(shè)
- 醫(yī)院日間手術(shù)的流程解析讓你更放心
- 四年級(jí)上綜合實(shí)踐-今天我當(dāng)家
- 第5課《認(rèn)識(shí)情緒+管理情緒》第1框《破解情緒的密碼》【中職專(zhuān)用】《心理健康與職業(yè)生涯》高教版2023基礎(chǔ)模塊
- 無(wú)人機(jī)在能源領(lǐng)域的應(yīng)用
- 2021年遼寧公務(wù)員考試行測(cè)試題
- 全國(guó)優(yōu)質(zhì)課一等獎(jiǎng)八年級(jí)上冊(cè)道德與法治《社會(huì)生活講道德-誠(chéng)實(shí)守信》課件
- 肺臟移植后的康復(fù)治療
- 金屬擠壓共(有色擠壓工)中級(jí)復(fù)習(xí)資料練習(xí)測(cè)試題附答案
- 高數(shù)測(cè)試卷一及答案(第一章)
評(píng)論
0/150
提交評(píng)論