1. 棧 Stack
定義:
限定僅在表尾進(jìn)行插入和刪除操作的線性表。即后進(jìn)先出的線性表(Last In First Out)表尾即棧頂top,表頭即棧低bottom。
存儲方式:
順序棧、鏈棧;
1. 順序棧:
一組地址連續(xù)的存儲單元,依次存放自棧低到棧頂?shù)臄?shù)據(jù)元素。
結(jié)構(gòu):兩個指針top,base,一個int size描述棧的大小;
主要操作:出棧和入棧(壓棧)
空棧:top = base;
非空棧:base指向棧低,top指向棧頂元素的下一個位置上。
C語言的結(jié)構(gòu)體
#define MAXSIZE 100 //順序棧存儲空間的初始分配量
typedef struct{
SElemtype *base;
SElemtype *top;
int stacksize;
}SqlStack;
2. 鏈棧
采用鏈?zhǔn)酱鎯Y(jié)構(gòu)實現(xiàn)棧,通常用單鏈表表示。
結(jié)構(gòu):stackNode(elemtype data,stackNode next);
主要操作: 對棧頂?shù)牟迦牒蛣h除
typedef struct StackNode{
SElemtype data;
struct StackNode *next;
}StackNode,*LinkStack;
2. 棧的應(yīng)用
- 數(shù)制轉(zhuǎn)換
十進(jìn)制數(shù)據(jù)N和其他進(jìn)制的轉(zhuǎn)換是計算機(jī)實現(xiàn)計算的基本問題,算法基于的原理:
N=(N div d)*d+N mod d
div:整除
mode:取余數(shù)
- 括號匹配的檢驗
- 表達(dá)式求值
3. 棧與遞歸
1.遞歸:
若在一個函數(shù)、過程或數(shù)據(jù)結(jié)構(gòu)定義的內(nèi)部又直接或間接出現(xiàn)定義本身的應(yīng)用,則稱為遞歸。
通常在3中情況下使用遞歸:
- 定義是遞歸的(Fact階乘函數(shù)、Fib二階的Fibonacci數(shù)列)
- 數(shù)據(jù)結(jié)構(gòu)是遞歸的(依次輸出鏈表中各個節(jié)點的遞歸)
- 問題的解法是遞歸(Hanoi問題)
遞歸過程與遞歸工作棧 暫時沒時間寫,有時間補(bǔ)上
遞歸算法的效率分析 暫時沒時間寫,有時間不上
將遞歸轉(zhuǎn)換為非遞歸方法
- 遞歸的優(yōu)點:結(jié)構(gòu)清晰,程序易讀;
- 遞歸的缺點:需要系統(tǒng)提供隱式棧這種結(jié)構(gòu)來實現(xiàn),占用內(nèi)存空間較多,運(yùn)行效率低。
遞歸的目的:提高算法的時間、空間性能,所以使用遞歸算法來分析問題,用非遞歸算法來解決問題;
將遞歸換為非遞歸的方法(兩種)
循環(huán)方法
1.單項遞歸
2.尾遞歸
利用棧消除遞歸
4.隊列 Queue
定義:是一種先進(jìn)先出(First In First Out)FIFO的線性表。
存儲表示:順序表示和鏈?zhǔn)奖硎荆?
順序存儲結(jié)構(gòu)
一組地址連續(xù)的存儲單元依次存放隊列頭到隊列尾的元素;
結(jié)構(gòu):兩個指針隊頭front和隊尾rear;
這種存儲會出現(xiàn)假溢出問題;
循環(huán)隊列
為了解決假溢出現(xiàn)象,將順序隊列臆造為一個環(huán)狀的空間,稱之為循環(huán)隊列。
隊頭、尾指針的環(huán)狀增1的操作用“模”運(yùn)算來實現(xiàn)。
區(qū)別隊滿和隊空的方法:
- 少用一個空間,隊列有m個空間,當(dāng)有m-1個元素時,就判定隊列已滿。
- 隊空:Q.font = Q.rear
- 隊滿:(Q.rear+1) % MAXQSIZE = Q.font
- 設(shè)置標(biāo)志位
鏈隊
鏈表表示的隊列即鏈隊;
隊列的應(yīng)用
打印二項式系數(shù)表