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 捕捉...