




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章棧和隊(duì)列要點(diǎn)本章主題:棧和隊(duì)列的應(yīng)用教學(xué)目的:1、理解棧和隊(duì)列的定義和特點(diǎn)2、<重點(diǎn)>熟練掌握棧類型的兩種實(shí)現(xiàn)方法。3、
<重點(diǎn)>熟練掌握循環(huán)隊(duì)列和鏈隊(duì)列的基本操作實(shí)現(xiàn)算法。
4、<難點(diǎn)>能在相應(yīng)的應(yīng)用問題中正確選用它們。3.1棧
1.棧的定義棧:是限定僅在表尾進(jìn)行插入或刪除操作的線性表。約定稱表尾端為棧頂(top),表頭端為棧底(bottom)。
棧的特點(diǎn):后進(jìn)先出(LIFO:lastinfirstout)棧又稱為“后進(jìn)先出”的線性表,簡(jiǎn)稱LIFO表。
2.棧的基本操作
InitStack(&S)
操作結(jié)果:構(gòu)造一個(gè)空棧S。DestroyStack(&S)
初始條件:棧S已存在。
操作結(jié)果:棧S被撤銷,即釋放S占用的存儲(chǔ)空間。ClearStack(&S)
初始條件:棧S已存在。
操作結(jié)果:將S清為空棧。StackEmpty(S)初始條件:棧S已存在。
操作結(jié)果:若棧S為空棧,則返回TRUE,否則FALSE。StackLength(S)操作結(jié)果:獲取S的元素個(gè)數(shù),即棧的長(zhǎng)度。
2.棧的基本操作
GetTop(S,&e)初始條件:棧S已存在且非空。
操作結(jié)果:用e返回S的棧頂元素。Push(&S,e)初始條件:棧S已存在。
操作結(jié)果:插入元素e為新的棧頂元素。Pop(&S,&e)初始條件:棧S已存在且非空。
操作結(jié)果:刪除S的棧頂元素,
并用e返回其值。
3、棧的實(shí)現(xiàn)和表示棧的兩種存儲(chǔ)表示方法:順序棧和鏈棧順序棧:棧的順序存儲(chǔ)結(jié)構(gòu)是利用一組地址連續(xù)的存儲(chǔ)單元依次存放自棧底到棧頂?shù)臄?shù)據(jù)元素,同時(shí)附設(shè)指針top指示棧頂元素在順序棧中的位置。top=0表示空棧。
一般情況下使用一維數(shù)組實(shí)現(xiàn)順序棧。
#defineMaxSize<存儲(chǔ)數(shù)據(jù)元素的最大個(gè)數(shù)>
typedefstruct{
ElemTypedata[MaxSize];
inttop;
}STACK;缺點(diǎn):棧在使用過程中所需最大空間的大小很難估計(jì),初始化設(shè)空棧時(shí)候不應(yīng)該限定棧的最大容量。
順序棧的實(shí)現(xiàn)和表示:#defineSTACK_INIT_SIZE100;//存儲(chǔ)空間初始分配量
#defineSTACKINCREAMENT10;//存儲(chǔ)空間分配增量
typedefstruct{ElemType*base;
ElemType*top;
intstacksize;}SqStack;順序棧的實(shí)現(xiàn)和表示:
int
InitStack(SqStack
*S){//初始化棧,構(gòu)造一個(gè)空棧SS.base=(ElemType
*)malloc(STACK_INT_SIZE*sizeof(ElemType));
if(!S.base)
return
0;//存儲(chǔ)分配失敗
S.top=S.base;
S.stacksize=STACK_INT_SIZE;
return
1;
}
int
Push(SqStack
*S,ElemType
e){//進(jìn)棧,插入元素e為新的棧頂元素if(S.top–S.base>=STACK_INT_SIZE){//棧滿,追加存儲(chǔ)空間
S.base=(ElemType
*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(ElemType));
if(!S.base)
return
0;//存儲(chǔ)分配失敗
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;
}
*S.top=e;
S.top++;
return
1;
}順序棧的實(shí)現(xiàn)和表示:int
Pop(SqStack
*S,ElemType
*e){//出棧,若棧不空,則刪除S的棧頂元素,用e返回其值。if(S.top==S.base)//棧空
return
0;
S.top--;
*e=*(S.top);return1;
}int
GetTop(SqStackS,ElemType*e){//獲取棧頂元素,用e返回棧頂元素
if(S.top==S.base)//棧空
return
0;
*e=*(S.top-1);return1;}鏈棧的實(shí)現(xiàn)和表示:
由于棧的插入刪除操作只能在一端進(jìn)行,而對(duì)于單鏈表來說,在首端插入刪除結(jié)點(diǎn)要比尾端相對(duì)容易一些,所以,將將單鏈表的首端作為棧頂端,即將單鏈表的頭指針作為棧頂指針。棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)類型定義實(shí)現(xiàn)://-----棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)-----typedefstructSNode{SElemTypedata;
//數(shù)據(jù)域structSNode*next;
//指針域}SNode,*LinkStack;
鏈棧的實(shí)現(xiàn)和表示://操作結(jié)果:構(gòu)造一個(gè)空棧S。StatusInitStack(LinkStack&S){S=(LinkStack)malloc(sizeof(SNode));if(!S)//存儲(chǔ)分配失敗exit(OVERFLOW);//exit(-2)程序異常退出S->next=NULL;S->data=NULL;returnOK;}//InitStack//操作結(jié)果:插入元素e為新的棧頂元素。StatusPush(LinkStack&S,SElemTypee){LinkStackp=(LinkStack)malloc(sizeof(SNode));p->next=S->next;//新結(jié)點(diǎn)指向棧頂p->data=e;S->next=p;//更新棧頂指針printf("插入的棧頂元素:%c\n",e);returnOK;}//Push
鏈棧的實(shí)現(xiàn)和表示://操作結(jié)果:若棧不空,則刪除S的棧頂元素,并用e返回其值;否則返回ERROR。StatusPop(LinkStack&S,SElemType&e){//若1個(gè)元素也沒有:if(S->next==NULL)returnERROR;//若有1個(gè)以上元素e=S->next->data;LinkStackptmp=S->next->next;free(S->next);S->next=ptmp;printf("刪除的棧頂元素:%d\n",e);returnOK;}//Pop
3.2棧的應(yīng)用舉例棧的特點(diǎn):后進(jìn)先出1、例子---數(shù)制轉(zhuǎn)換十進(jìn)制數(shù)N和其它d進(jìn)制數(shù)的轉(zhuǎn)換,一個(gè)常用的轉(zhuǎn)換方法:N=(Ndivd)*d+Nmodd(div為整除運(yùn)算,mod為求余運(yùn)算)例如(1348)10=(2504)8NNdiv8Nmod8134816841682102125202計(jì)算順序輸出順序voidconversion(){//對(duì)于輸入的任意一個(gè)非負(fù)十進(jìn)制整數(shù),打印輸出與其等值的八進(jìn)制InitStack(S);//構(gòu)造空棧scanf("%d",&N);while(N)
{Push(S,N%8);//入棧N=N/8;
}while(!StackEmpty(S)){Pop(S,e);//出棧printf("%d",e);}printf("\n");DestroyStack(S);//銷毀棧}//conversion算法3.12、括號(hào)匹配的檢測(cè)假設(shè)表達(dá)式中允許包含兩種括號(hào):圓括號(hào)和方括號(hào),其嵌套順序隨意,即([]())或者[([][])]等為正確的格式,[(]或([())為不正確表達(dá)式。檢驗(yàn)表達(dá)式中的括號(hào)格式。
考慮:利用棧結(jié)構(gòu)保存每個(gè)出現(xiàn)的左括號(hào),當(dāng)遇到右括號(hào)的時(shí)候,則和棧頂元素檢驗(yàn)是否匹配,匹配則彈出棧頂元素,不匹配則出錯(cuò),格式不正確。算法設(shè)計(jì)思想:(1)凡出現(xiàn)左括號(hào),則進(jìn)棧;(2)凡出現(xiàn)右括號(hào),首先檢查棧是否為空,若棧空,則表明“右括號(hào)”多了,
否則和棧頂元素比較,若匹配,則“左括號(hào)出棧”,
否則,不匹配(3)表達(dá)式檢驗(yàn)結(jié)束時(shí),若棧空,則匹配正確,否則,表明左括號(hào)多了voidcheck()
{//檢驗(yàn)表達(dá)式中括號(hào)()、[]是否配對(duì)
InitStack(S);gets(expression);while(expression[i]!='\0'){switch(expression[i]){case‘左括號(hào)’:Push(S,expression[i]);break;//當(dāng)遇見左符號(hào)時(shí)壓入棧中
case'右括號(hào)'://當(dāng)遇見右符號(hào)時(shí)從棧中彈出棧頂符號(hào)//進(jìn)行匹配if(!StackEmpty(S))
{Pop(S,e);if(!(e=='('&&expression[i]==')'||e=='['&&expression[i]==']'))//匹配成功:繼續(xù)讀入下一個(gè)字符//匹配失敗:立即停止,并報(bào)錯(cuò)exit(ERROR);}
elseexit(ERROR);default:break;//當(dāng)遇見普通字符時(shí)忽略
}i++;}if(StackEmpty(S))//成功:所有字符掃描完畢,且
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鎂、鈦相關(guān)常用有色金屬加工材合作協(xié)議書
- 家具設(shè)計(jì)部門各崗位職責(zé)
- 醫(yī)療建筑工程監(jiān)理總結(jié)報(bào)告
- 幼小銜接的語言發(fā)展促進(jìn)計(jì)劃
- 2025年血液成份輸血裝置合作協(xié)議書
- 護(hù)理帶教中的倫理問題心得體會(huì)
- 幼兒園大班上學(xué)期心理健康計(jì)劃
- 企業(yè)技能提升線上線下培訓(xùn)計(jì)劃
- 小學(xué)信息中心數(shù)字化建設(shè)工作計(jì)劃
- 中醫(yī)醫(yī)院導(dǎo)診工作職責(zé)
- 2025陜煤集團(tuán)榆林化學(xué)有限責(zé)任公司招聘(137人)筆試參考題庫附帶答案詳解
- 衢州2025年浙江衢州龍游縣綜合事業(yè)單位招聘43人筆試歷年參考題庫附帶答案詳解
- 測(cè)繪成果質(zhì)量管理制度(一)
- 小學(xué)防碘缺乏課件
- 學(xué)習(xí)解讀《關(guān)于進(jìn)一步強(qiáng)化食品安全全鏈條監(jiān)管的意見》課件(2025年3月)
- 支氣管哮喘防治指南(2024年版)解讀
- 北京海淀區(qū)2023-2024學(xué)年八年級(jí)下學(xué)期期中考試物理試題(解析版)
- 2025年陪審員考試題及答案
- 居室空間設(shè)計(jì) 課件 項(xiàng)目八廚房空間設(shè)計(jì)
- 人教版小學(xué)五年級(jí)語文下冊(cè)2024-2025學(xué)年度第二學(xué)期第五單元質(zhì)量檢測(cè)試卷含參考答案
- 2024年煤礦安全規(guī)程(修訂)
評(píng)論
0/150
提交評(píng)論