深圳大學(xué)-數(shù)據(jù)結(jié)構(gòu)-2017棧和隊(duì)列演示文檔
《深圳大學(xué)-數(shù)據(jù)結(jié)構(gòu)-2017棧和隊(duì)列演示文檔》由會(huì)員分享,可在線閱讀,更多相關(guān)《深圳大學(xué)-數(shù)據(jù)結(jié)構(gòu)-2017棧和隊(duì)列演示文檔(63頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
.,第三章棧和隊(duì)列,,,數(shù)據(jù)結(jié)構(gòu),.,一、棧,2,第一節(jié) 棧,棧是限定僅在表尾(top)進(jìn)行插入或刪除操作的線性表。 允許插入和刪除的一端稱為棧頂(top,表尾),另一端稱為棧底(bottom,表頭) 特點(diǎn):后進(jìn)先出 (LIFO),.,二、棧的實(shí)現(xiàn),3,第一節(jié) 棧,棧的存儲(chǔ)結(jié)構(gòu)主要有兩種: 1. 順序棧 2. 鏈?zhǔn)綏?.,一、順序棧,4,第二節(jié) 順序棧,順序棧是棧的順序存儲(chǔ)結(jié)構(gòu) 利用一組地址連續(xù)的存儲(chǔ)單元依次存放自棧底到棧頂?shù)臄?shù)據(jù)元素 指針top指向棧頂元素在順序棧中的下一個(gè)位置, base為棧底指針,指向棧底的位置。,.,二、順序棧的定義,5,第二節(jié) 順表?xiàng)?采用C語(yǔ)言中動(dòng)態(tài)分配的一維數(shù)組表示順序表,#define STACK_INIT_SIZE 100 //棧存儲(chǔ)空間的初始分配量 #define STACKINCREMENT 10 //棧存儲(chǔ)空間的分配增量 typedef struct { SElemType *base //存儲(chǔ)空間基址 SElemType *top; //棧頂指針 int stacksize; //當(dāng)前分配的存儲(chǔ)容量(元素?cái)?shù)) } SqStack;,.,三、順序棧的特性,6,第二節(jié) 順序棧,top==0 或top==base 表示空棧 base=NULL表示棧不存在 當(dāng)插入新的棧頂元素時(shí),指針top+1 刪除棧頂元素時(shí),指針top-1 當(dāng)top>stacksize時(shí),棧滿,溢出,.,四、順序棧的主要操作,7,第二節(jié) 順序棧,ADT Stack { 數(shù)據(jù)對(duì)象:D = {ai | ai∈ElemSet, i=1,2,3,…,n} 數(shù)據(jù)關(guān)系:R = { | ai-1,ai∈D} 基本操作: Status InitStack(SqStack &S) // 構(gòu)造空棧 Status Push(SqStack &S, e) // 進(jìn)棧 Status Pop(SqStack &S, &e) // 出棧 Status GetTop(SqStack S, &e)// 取棧頂元素值 Status StackEmpty(SqStack S) // 棧是否為空 } ADT Stack,.,五、創(chuàng)建順序棧,8,第二節(jié) 順序棧,Status InitStack(SqStack } // InitStack,.,六、進(jìn)棧(插入新元素),9,第二節(jié) 順序棧,Status Push(SqStack } // Push,.,七、出棧(刪除元素),10,第二節(jié) 順序棧,Status Pop(SqStack } // Pop,.,八、取棧頂元素,11,第二節(jié) 順序棧,Status GetTop(SqStack S, SElemType } // GetTop,.,1.創(chuàng)建堆棧節(jié)點(diǎn)類 template class LinStack;//前視定義,否則友元無(wú)法定義 template //模板類型為T(mén) class StackNode { friend class LinStack; //定義類LinStack為友元 private: T data; //數(shù)據(jù)元素 StackNode *next; //指針 public: StackNode(StackNode *ptrNext = NULL) //構(gòu)造頭結(jié)點(diǎn) {next = ptrNext;} StackNode(const T,第三節(jié) 鏈棧,.,第三節(jié) 鏈棧,2.創(chuàng)建鏈?zhǔn)蕉褩n? template class LinStack { private: StackNode *head; //頭指針 int size; //數(shù)據(jù)元素個(gè)數(shù) public: LinStack(void); //構(gòu)造函數(shù) ~LinStack(void);//析構(gòu)函數(shù) void Push(const T,.,第三節(jié) 鏈棧,3.鏈?zhǔn)蕉褩5膶?shí)現(xiàn) template LinStack::LinStack() //構(gòu)造函數(shù) { head = new StackNode;//頭指針指向頭結(jié)點(diǎn) size = 0; //size的初值為0 } template LinStack::~LinStack(void) //析構(gòu)函數(shù) { StackNode *p, *q; //釋放所有動(dòng)態(tài)申請(qǐng)的結(jié)點(diǎn)空間 p = head; //p指向頭結(jié)點(diǎn) while(p != NULL) //循環(huán)釋放結(jié)點(diǎn)空間 { q = p; p = p->next; delete q; } } template int LinStack::NotEmpty(void) const //堆棧非空否 { if(size != 0) return 1; else return 0; },.,第三節(jié) 鏈棧,template void LinStack::Push(const T //元素個(gè)數(shù)加1 },.,第三節(jié) 鏈棧,template T LinStack::Pop(void) //出棧 { if(size == 0) { cout *p = head->next;//p指向棧頂元素結(jié)點(diǎn) T data = p->data; head->next = head->next->next; //原棧頂元素結(jié)點(diǎn)脫鏈 delete p; //釋放原棧頂結(jié)點(diǎn)空間 size--; //結(jié)點(diǎn)個(gè)數(shù)減1 return data; //返回原棧頂結(jié)點(diǎn)的data域值 },.,第三節(jié) 鏈棧,template T LinStack::GetTop(void)const //取棧頂元素 { return head->next->data; },.,一、數(shù)值轉(zhuǎn)換,18,第四節(jié) 棧的應(yīng)用舉例,將十進(jìn)制轉(zhuǎn)換為其它進(jìn)制(d),其原理為: N = (N/d)*d + N mod d [例1]:(1348)10=(2504)8 ,其運(yùn)算過(guò)程如下: N N /8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2,.,一、數(shù)值轉(zhuǎn)換,19,第四節(jié) 棧的應(yīng)用舉例,void conversion () { InitStack(S); // 創(chuàng)建新棧S scanf (“%d”,N); // 輸入一個(gè)十進(jìn)制數(shù)N while (N) { Push(S, N % 8); // 將余數(shù)送入棧中 N = N/8; // 求整除數(shù) } while (!StackEmpty(S)) { // 如果棧不空 Pop(S,e); // 將棧中數(shù)出棧 printf ( "%d", e ); } } // conversion,.,二、行編輯程序,20,第四節(jié) 棧的應(yīng)用舉例,用戶輸入一行字符 允許用戶輸入出差錯(cuò),并在發(fā)現(xiàn)有誤時(shí),可以用退格符“#”及時(shí)更正 假設(shè)從終端接受兩行字符: whli##ilr#e(s#*s) 實(shí)際有效行為: while (*s),.,二、行編輯程序,21,第四節(jié) 棧的應(yīng)用舉例,[例2]:對(duì)用戶輸入的一行字符進(jìn)行處理,直到行結(jié)束(“\n”) void LineEdit() { InitStack(s); ch = getchar(); //從終端接受一個(gè)字符 while (ch != ’\n’) { switch(ch) { case ’#’ : Pop(S, c);break; // 僅當(dāng)棧非空時(shí)退棧 case ‘@’: ClearStack(S); break; default: Push(S, ch); break; // 有效字符進(jìn)棧 } ch = getchar(); // 從終端接受一個(gè)字符 } //將從棧底到棧頂?shù)臈?nèi)字符傳送到調(diào)用過(guò)程的數(shù)據(jù)區(qū); … },.,第四節(jié) 棧的應(yīng)用舉例,三.括號(hào)匹配 假設(shè)一個(gè)算術(shù)表達(dá)式中包括( )、[ ]和{ }三種形式的括號(hào),設(shè)計(jì)一個(gè)判別表達(dá)式中括號(hào)是否正確匹對(duì)的程序。 1.算法思想: 算術(shù)表達(dá)式中右括號(hào)和左括號(hào)匹配的次序:后到括號(hào)要最先被匹配的“后進(jìn)先出”堆棧操作特點(diǎn),因此可用一個(gè)堆棧來(lái)進(jìn)行判斷。 順序掃描算術(shù)表達(dá)式(表現(xiàn)為一個(gè)字符串); 當(dāng)遇到三種類型的左括號(hào)時(shí),該括號(hào)進(jìn)棧; 當(dāng)遇到某一種類型的右括號(hào)時(shí),比較當(dāng)前棧頂括號(hào)是否與之匹配,若匹配則退棧,繼續(xù)進(jìn)行判斷; 若不匹配,則左右括號(hào)配對(duì)次序不正確,結(jié)束。 若字符串當(dāng)前為某一類型的右括號(hào)而堆棧為空,則右括號(hào)多于左括號(hào),結(jié)束。 若字符串掃描結(jié)束而堆棧非空,則左括號(hào)多于右括號(hào),結(jié)束。 若字符串掃描結(jié)束而堆棧為空,則左右括號(hào)匹配正確,結(jié)束。,.,第四節(jié) 棧的應(yīng)用舉例,#include #include #include using namespace std; bool brackMatch(string str) //括號(hào)匹配 { int i = 0; stack stk; // 使用C++的stack類 while(i- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
10 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 深圳大學(xué) 數(shù)據(jù)結(jié)構(gòu) 2017 隊(duì)列 演示 文檔
鏈接地址:http://m.kudomayuko.com/p-359908.html