




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第三章堆棧和隊(duì)列、堆棧和隊(duì)列是線性表數(shù)據(jù)結(jié)構(gòu),都是“操作受限”的線性表的兩個(gè)茄子應(yīng)用程序。堆??梢栽谟?jì)算機(jī)上以多種茄子方法實(shí)現(xiàn)。硬堆棧:使用CPU的某些寄存器組或使用類似硬件或內(nèi)存的特殊區(qū)域?qū)崿F(xiàn)。這些堆棧容量有限,但速度快。軟堆棧:這些堆棧主要在內(nèi)存中實(shí)現(xiàn)。堆棧容量可能很大。實(shí)現(xiàn)方法有兩種:動態(tài)方法和靜態(tài)方法。牙齒章節(jié)介紹了堆棧和隊(duì)列的基本概念、存儲結(jié)構(gòu)、基本任務(wù)以及這些任務(wù)的具體實(shí)現(xiàn)。3.1堆棧,3.1.1堆棧的基本概念,1堆棧的概念堆棧:限制插入和刪除到表的一端的線性表。也稱為后進(jìn)先出(LIFO)或先進(jìn)先出(FILO)線性表。堆棧頂部:允許插入、刪除操作的結(jié)尾(也稱為頁腳)。使用堆棧頂部指
2、針(top)顯示堆棧頂部元素。堆疊底部:固定端,也稱為標(biāo)頭??斩询B:如果表格中沒有元素,則稱為空堆疊。堆棧S=(a1,a2,an),a1是堆棧底部元素,an是堆棧頂部元素(參見圖3-1)。在堆棧中,按元素a1、a2、an的順序進(jìn)入堆棧,返回堆棧的第一個(gè)元素必須是堆棧頂部元素。也就是說,堆棧修改是按照后進(jìn)先出的原則進(jìn)行的。2堆棧中的抽象數(shù)據(jù)類型定義ADT Stack數(shù)據(jù)對象D=ai|aiElemSet,i=1,2,n,n0數(shù)據(jù)關(guān)系:R=|ai-1,aid,I=2靜態(tài)順序,具體取決于陣列是否可以根據(jù)需要增大靜態(tài)順序堆棧實(shí)現(xiàn)很簡單,但不能根據(jù)需要增加堆棧的存儲空間。動態(tài)順序堆??梢愿鶕?jù)需要增加堆棧的
3、存儲空間,但實(shí)現(xiàn)有點(diǎn)復(fù)雜。3.1.2堆棧順序存儲表示,使用動態(tài)一維數(shù)組存儲堆棧。動力學(xué)意味著可以根據(jù)需要增加堆棧中的大小數(shù)。使用Bottom表示堆棧底部指針,堆棧底部保持不變。堆棧頂部根據(jù)堆棧進(jìn)入和堆棧后退操作而變化。Top(稱為堆棧頂部指針)指示當(dāng)前堆棧頂部的位置。使用Top=bottom作為堆棧中的空標(biāo)簽,每次都指向Top牙齒堆棧頂部數(shù)組中的下一個(gè)存儲位置。節(jié)點(diǎn)堆棧:首先將數(shù)據(jù)元素(指向top牙齒的當(dāng)前位置)存儲在堆棧頂部,然后執(zhí)行top加1,使其指向top牙齒堆棧頂部的下一個(gè)存儲位置。3.1.2.1堆棧的動態(tài)順序存儲表示法,節(jié)點(diǎn)堆棧:首先執(zhí)行top減1以使top指向堆棧頂部的元素存儲位置
4、,然后刪除堆棧頂部的元素圖3-2是動態(tài)堆棧的更改圖。實(shí)施基本任務(wù)1定義堆棧類型#define STACK_SIZE 100 /*堆棧初始矢量大小*/#define STACKINCREMENT 10 /*存儲空間分配增量*/# typed ef int ElemType ttype/*沒有堆棧。值為NULL */ElemType *top。/*堆棧頂部指針*/int stacksize;/*當(dāng)前分配的空間(元素)*/sq stack;2堆棧初始化Status Init _ Stack(void)sq Stack S;s . bottom=(elem type *)malloc(stack _
5、size * sizeof(elem type);If(!s . bottom)return ERROR;s . top=s . bottom;/*當(dāng)堆棧為空時(shí),堆棧頂部和堆棧底部的指針相同。*/s . stacksize=STACK _ SIZE;Return OK,3堆棧(元素堆棧)statuspush (sqstacks,elem type e)if(s . top-s . bottom=s . stack size-1)s/*堆棧已滿,s . bottom)return ERROR;s . top=s . bottom s . stack size;S. stacksize=STACK
6、INCREMENT* s . top=e;S.top/*堆棧頂部指針加1會使e牙齒到新的堆棧頂部*/return OK。4堆棧(元素堆棧)狀態(tài)pop (sqstacks,elemtype * e)/*彈出堆棧頂部元素*/if (S. top=S. bottom) reed /E=* S. topReturn OK,使用靜態(tài)一維數(shù)組存儲堆棧。堆棧底部是固定的,堆棧頂部根據(jù)堆棧進(jìn)入和堆棧后退操作而變化,堆棧底部是固定的。堆棧頂部根據(jù)堆棧進(jìn)入和堆棧返回操作而變化,使用整數(shù)變量top(稱為堆棧頂部指針)指示當(dāng)前堆棧頂部位置。使用top=0表示堆棧的初始空狀態(tài),每個(gè)top都指向存儲數(shù)組堆棧頂部的位置。節(jié)
7、點(diǎn)堆棧:首先執(zhí)行top加1以指向top牙齒新堆棧頂部位置,然后將數(shù)據(jù)元素(指向top牙齒的當(dāng)前位置)存儲在堆棧頂部。3.1.2.2堆棧的靜態(tài)順序存儲表示節(jié)點(diǎn)堆棧的表示法。也就是說,首先移除指向top牙齒的堆棧頂部元素,然后執(zhí)行top減1,使其指向top牙齒新堆棧頂部位置。如果堆棧中的數(shù)組有Maxsize個(gè)元素(top=Maxsize-1),則堆棧已滿。圖3-3是大小5的堆棧變化圖。實(shí)現(xiàn)基本任務(wù)1定義堆棧類型# define MAX_STACK_SIZE 100 /*堆棧矢量大小*/# typedef int ElemType;typedef struct sq stack elem type
8、stack _ array max _ stack _ size;Int topSqStack,2堆棧初始化sqstack init _ stack(void)sq stacks;s . bottom=s . top=0;返回(s);3堆棧(元素堆棧)狀態(tài)推送(sqstacks,elemtype e)/*數(shù)據(jù)元素e作為堆棧,位于新堆棧的頂部*/if (s.top=max _ stack) /*。/*堆棧頂部指針1 */s . stack _ arrays . top=e;/* e牙齒到新堆棧頂部*/return OK。/*堆棧成功*/,4堆棧(元素堆棧)status pop (sqstacks
9、,elemtype * e)/*彈出堆棧頂部元素*/if(s . top=0/*)s . top-;Return OK如果堆棧已滿,則堆棧操作將生成空間溢出(稱為“溢出”)。溢出是一種錯(cuò)誤狀態(tài),應(yīng)避免。堆棧為空時(shí),使用堆棧還會生成溢出(“下溢”)。下溢可能是正?,F(xiàn)象。使用堆棧時(shí),由于堆棧的初始或最終狀態(tài)都是空堆棧,因此下溢通常用作控制變換的條件。1堆棧中的鏈?zhǔn)潜硎径褩5逆湸鎯Y(jié)構(gòu)稱為鏈堆棧,是操作受限的單鏈表。插入和刪除操作只能在標(biāo)題位置執(zhí)行。因此,鏈堆疊不需要像單個(gè)鏈表那樣附加頭節(jié)點(diǎn)。堆棧頂部指針top是鏈表頭指針。圖3-4是堆棧的鏈存儲表示。3.1.3堆棧中的鏈存儲表示,鏈堆棧中的節(jié)點(diǎn)類型
10、為:type def struct stack _ node elemtype data;Struct Stack _ Node * nextStack _ Node,2鏈堆?;静僮鲗?shí)現(xiàn)(1)堆棧初始化stack _ node * init _ link _ stack(void)stack _ node * top;top=(stack _ node *)malloc(size of(stack _ node);top-next=NULL;return(top);(2)堆棧(元素堆棧)狀態(tài)推送(stack _ node * top,elemtype)stack _ node * p;p=(
11、stack _ node *)malloc(size of(stack _ node);If(!p)return ERROR;/*新節(jié)點(diǎn)申請失敗。返回錯(cuò)誤標(biāo)志*/p-data=e;p-next=top-next;top-next=p;/*掛鉤鏈*/回位ok;(3)堆棧(元素堆棧)status pop (stack _ node * top,elemtype * e)/*堆棧頂部元素堆棧*/stack _ node *if(top-next=NULL)return ERROR;/*堆棧為空,返回錯(cuò)誤標(biāo)志*/p=top-next。e=p-data;/*獲取堆棧頂部元素*/top-next=p-ne
12、xt;/*修改堆疊頂部指標(biāo)*/free(p);Return OK,3.2堆棧應(yīng)用節(jié)目,由于“后進(jìn)先出”的固有特性,堆棧成為計(jì)算機(jī)編程中常用的工具和數(shù)據(jù)結(jié)構(gòu)堆棧。以下是堆棧應(yīng)用程序的一些茄子示例:3.2.1數(shù)值轉(zhuǎn)換,十進(jìn)制整數(shù)N到其他十進(jìn)制D (2,8,16)的轉(zhuǎn)換是電腦實(shí)現(xiàn)計(jì)算的基本問題。轉(zhuǎn)換定律:牙齒轉(zhuǎn)換定律相當(dāng)于簡單的算法原理: n=(n div d)*d n mod d。其中div是除法運(yùn)算,mod對應(yīng)于其馀運(yùn)算,例如(1348)10=(2504)8。計(jì)算方法如下:n n n div 8n mod 8 1348 168 4 168 4 168 21 0 21 2 2 0 2,void c
13、onversion(int n,int d) /*將十進(jìn)制整數(shù)n轉(zhuǎn)換為d(2或8)小數(shù)。*/Int k,* e;s=Init _ Stack();while(n0)k=n % d;推(s,k);n=n/d;/*查找所有剩馀項(xiàng)并堆疊*/while (S.top)!=0) /*堆棧不為空時(shí)的堆棧,輸出*/pop(S,e);Printf( ,* e e);3.2.2括號匹配問題,在編譯字處理軟件或計(jì)算機(jī)編程時(shí),經(jīng)常需要檢查字符串或表達(dá)式中的括號是否匹配。思想匹配:從左到右掃描字符串(或表達(dá)式),每個(gè)右括號與最近遇到的左括號匹配。從左到右掃描期間發(fā)現(xiàn)的左括號可以保存在堆棧中。每次出現(xiàn)右括號時(shí),與堆棧頂
14、部的左括號(如果有)匹配,并從堆棧頂部刪除左括號。算法思想:設(shè)置堆棧和讀取左括號時(shí),將左括號放入堆棧。讀取右括號后,從堆棧中取出一個(gè)元素,將其與讀取的左括號匹配,如果匹配成功,則繼續(xù)讀取。否則,如果匹配失敗,則返回FLASE。算法說明# define true 0 # define flase-1 sq stacks;s=Init _ Stack();/*初始化堆棧*/int Match_Brackets() char ch,x;scanf(“% c”,while (ASC (ch)!=13),if (ch=() | | (ch=) push (s,ch);else if(ch=)x=pop(
15、S);If (x!=) printf(“括號不匹配”);Return FLASEelse if(ch=)x=pop(S);If (x!=() printf(括號不匹配);Return FLASE,if (S.top)!=0) printf(“括號數(shù)不匹配!”);Return FLASEElse return TRUE,3.2.2堆棧和遞歸調(diào)用實(shí)現(xiàn),堆棧的另一個(gè)重要應(yīng)用是在編程語言內(nèi)實(shí)現(xiàn)遞歸調(diào)用。遞歸調(diào)用:函數(shù)(或過程)直接或間接調(diào)用自己,簡稱遞歸。遞歸是計(jì)算機(jī)編程中的強(qiáng)大工具。因?yàn)檫f歸函數(shù)結(jié)構(gòu)明確,程序容易讀,準(zhǔn)確性容易證明。實(shí)際上有效的遞歸調(diào)用函數(shù)(或過程)必須包含兩個(gè)部分:遞歸規(guī)則(方法)
16、、退出條件,以避免遞歸調(diào)用在沒有中斷的情況下進(jìn)行。示例:n!為了確保遞歸調(diào)用正確運(yùn)行,將“迭代任務(wù)堆?!毖例X設(shè)置為在整個(gè)遞歸調(diào)用過程中使用的數(shù)據(jù)存儲。每個(gè)級別都包含參數(shù)、本地變量和上一級別的返回地址等信息,構(gòu)成了“操作歷史記錄”。每次進(jìn)入遞歸層次時(shí),新的操作記錄都被壓在堆棧頂部。每次退出每個(gè)遞歸時(shí),都會在堆棧頂部彈出操作記錄。函數(shù)調(diào)整返回函數(shù)調(diào)用的常規(guī)步驟。(1)如果堆棧為空,則執(zhí)行正常返回。在堆棧頂部彈出操作記錄。將作業(yè)記錄的參數(shù)值、本地變量的值分配給該變量。讀取返回地址。將函數(shù)值指定給相應(yīng)的變量。(5)轉(zhuǎn)移到返回地址。1隊(duì)列的基本概念隊(duì)列:也是操作受限的線性表。先進(jìn)先出(FIFO)中的線性表格。只能在表格的一端插入,在另一端刪除。第一個(gè):允許刪除的端點(diǎn)稱為第一個(gè)團(tuán)隊(duì)。rear:允許插入的端點(diǎn)稱為rear。例:排隊(duì)購物。排隊(duì)操作系統(tǒng)上的作業(yè)。先排隊(duì)的成員
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鍋爐安全監(jiān)控器行業(yè)深度研究分析報(bào)告(2024-2030版)
- 連云港鋰離子電池材料項(xiàng)目可行性研究報(bào)告
- 2020-2025年中國整體試驗(yàn)機(jī)行業(yè)市場調(diào)查研究及投資戰(zhàn)略咨詢報(bào)告
- 職業(yè)目標(biāo)課件
- 職業(yè)病報(bào)告課件
- 河北省張家口市師大實(shí)驗(yàn)中學(xué)2025屆高二化學(xué)第二學(xué)期期末聯(lián)考模擬試題含解析
- 職業(yè)生涯計(jì)劃設(shè)計(jì)課件
- 職業(yè)生涯規(guī)劃說課課件模板
- 公益性公墓修建性詳細(xì)規(guī)劃設(shè)計(jì)方案招投標(biāo)書范本
- 2025屆安徽省六安市舒城中學(xué)仁英班高一下化學(xué)期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 集裝箱七點(diǎn)檢查表
- 部編初一語文閱讀理解最全答題模板與技巧+專項(xiàng)訓(xùn)練練習(xí)題
- 2023年湖北省高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試題試卷及答案解析
- 保定一中1+3物理試卷
- 弟子規(guī)注音A4直接打印版
- 金融學(xué)原理重點(diǎn)總結(jié)彭興韻
- Cmk設(shè)備能力指數(shù)分析表
- J17J177 鋼絲網(wǎng)架珍珠巖復(fù)合保溫外墻板建筑構(gòu)造
- 水泥檢測培訓(xùn)試題(附答案)
- 譯林版三年級英語上冊《全冊課件》ppt
- 高標(biāo)準(zhǔn)農(nóng)田建設(shè)上圖入庫(技術(shù)培訓(xùn))
評論
0/150
提交評論