筆記 資料結構 棧

2021-10-05 11:35:35 字數 3611 閱讀 2808

2)鏈式儲存

3例題4應用

線性表的特點:

1:有限,線性表的元素個數稱為線性表的長度

2:有序,乙個接著乙個,除了首位外,每個元素有個前驅元素和乙個後繼元素,元素間是一對一的關係。

棧是限定僅在表尾進行插入和刪除的線性表

棧就像是一摞盤子,每次洗碗時將盤子乙個接著乙個向上疊,使用時從上往下乙個乙個取,後放上去的在頂部,先使用,先放上去的在底部,後使用。

如上圖:我們對棧的基本操作有進棧(壓棧)和出棧.(彈棧)。

棧有兩種儲存方式,一種是順序儲存,另一種是鏈式儲存。

:通過一維陣列來實現。棧是要在表尾(棧頂)入棧出棧的,那麼我們用陣列的哪一端做棧底呢?

用下標為0的一端做棧底比較方便,因為棧頂要不斷進行操作。

首先要設計乙個結構體,它包含乙個陣列用來存資料,乙個變數記錄棧頂的位置。

#define maxsize 100

typedef

int selemtype;

//棧的元素型別stackelementtype

typedef

struct

sqstack;

//申請空間,將棧頂指標置為-1表棧空

sqstack a;

a.top=-1

;

然後設計兩個函式實現入棧,出棧操作

//入棧

intpush

(sqstack *s,selemtype e)

//出棧,e用來儲存棧頂元素

intpop

(sqstack *s,selemtype *e)

優點是**簡潔,操作簡單,缺點是事先規定了棧大小,元素過少空間浪費,元素過多空間不夠

可以動態的申請空間,解決這個問題

我們用單鏈表來實現鏈棧

*思考一下:用鍊錶的哪一頭來做棧底,哪一頭做棧頂呢?*

棧要在棧頂對資料入棧出棧,我們要考慮單鏈表每個節點指向下個節點,它無法訪問上個節點,所以當乙個元素出棧後,為了能找到棧裡的元素,應該採用頭插法實現入棧。

鏈棧需要的函式較多

stack *

creatstack()

;//建立

intpushstack

(stack *stack,datetype date)

;//入棧

intpopstack

(stack *stack)

;//出棧,把動態申請的空間給free了

datetype gettopelement

(stack *stack)

;//獲得棧頂元素

void

destorystack

(stack *stack)

;//銷毀

intisempty

(stack *stack)

;//判斷棧是否空了,類似上面top==-1

void

stackempty

(stack *stack)

;//清空棧

每個節點

typedef

int datetype;

typedef

struct nodestack;

//建立

stack *

creatstack()

else

printf

("out of stack");

return

null

;}

//入棧

intpushstack

(stack *stack,datetype date)

return0;

}

入棧操作如下圖

出棧

int

popstack

(stack *stack)

return0;

}

獲取棧頂元素

datetype gettopelement

(stack *stack)

return-1

;//棧空返回-1

}

完整**

#include

#include

#define max 100

typedef

int datetype;

typedef

struct nodestack;

stack *

creatstack()

else

printf

("out of stack");

return

null;}

intpushstack

(stack *stack,datetype date)

return0;

}int

popstack

(stack *stack)

return0;

}datetype gettopelement

(stack *stack)

return-1

;}void

destorystack

(stack *stack)

intisempty

(stack *stack)

void

stackempty

(stack *stack)

printf

("empyed");

}int

main()

例題:字串匹配: 給定乙個只包括 (,),,[,] 的字串,判斷字串是否有效。 有效字串需滿足:

1、左括號必須用相同型別的右括號閉合。 2、左括號必須以正確的順序閉合。

輸入: 「()」

輸出: yes

.輸入:「(>」

輸出:no

.輸入(

輸出no

輸入乙個括號字串,依次檢驗,若為左括號則入棧,若為右括號則判斷棧頂字元是否與之相對應,在最後還需判斷棧是否為空,如果不為空則不匹配。

#include

intfun

(char

*s)else

i++;}

if(top ==-1

)return0;

//不空返回 0

}int

main()

else

}

棧的應用應用:後續表示式,便於計算機計算優先

筆記 資料結構 棧

特性 先進後出,不可訪問索引,只能逐漸推入推出 介面inte ce istackds 得到棧中資料個數,屬性 int getlength 同上,方法型別的 bool isempty 檢驗是否為空 void clear 清空 void push t item 推入資料 t pop 獲得棧頂資料並刪去 ...

演算法筆記 資料結構 棧

在之前,學過了stl的stack容器,所以以上函式可以通過庫呼叫 但是stl中沒有實現清空函式,所以如果需要實現棧的清空,可以用乙個while迴圈反覆pop出元素直到棧空 while st.empty codeup 1918 簡單計算器題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值...

筆記 資料結構

解釋經典例題 計算給定多項式在給定點x處的值。f x a0 a1 x a n 1 x n 1 a n x n 方法一 double num int n,double array,double x 改進方法 double num int n,double array,double x clock 捕捉...