棧的基本操作(一)
阿新 • • 發佈:2019-01-04
1.棧的基本概念
棧是一種只能在一端進行插入或刪除操作的線性表。其中允許進行插入或刪除操作的一端稱為(Top),棧頂由一個稱為棧頂指標的位置指示器(其實就是一個變數,對於順序棧,就是記錄棧頂元素在陣列位置標號的一個整型變數;對於鏈式棧,就是記錄棧頂元素所在結點地址的指標)來指示,它是動態變化的。表的另一端稱為棧底,棧底是固定不變的。棧的插入和操作一般稱為入棧和出棧。本篇文章以順序棧為主。
棧的特點
先進先出(FILO)。
棧的儲存結構
棧有兩種主要的儲存結構:順序棧和鏈式棧。棧是一種在操作上稍加限制的線性表,即其本質就是線性表,而線性表有兩種主要的儲存結構—順序表和鏈式表,因此棧有兩種儲存結構。
棧的數學性質
當n個編號元素以某種順序進棧,並且可以在任意時刻出棧,所獲得的編號元素排列的數目N恰好滿足Catalan函式的計算,即
2.順序棧的基本操作
1.順序棧定義
typedef struct{
int data[maxSize];//存放棧中元素
int top;//棧頂指標
}SqStack;
如圖為順序棧的示意圖。
對於順序棧,一共有4個要素,包括兩個特殊狀態和兩個操作。
兩個特殊狀態
棧空狀態(st.top==-1)
棧滿狀態(st.top==maxSize-1)兩個操作
元素進棧操作:++(st.top);st.data[st.top]=x;。 既然規定了top為1的時候棧空,則元素進棧操作必須是先移動指標,再進入元素
**元素出棧操作**x=st.data[st.top];–(st.top);。進棧操作的次序決定了出棧操作次序,由於進棧是先變動指標,再進入元素,所以出棧操作必須是先取出元素,再變動指標。
2.順序棧的基本演算法操作
1.初始化順序棧
初始化一個棧,只需要將棧頂指標置為-1即可。
void initStack(SqStack &st){
st.top=-1;
}
2.判斷棧空
棧st為空時返回1,否則返回0。
int isEmpty(SqStack st){
if(st.top==-1){
return 1 ;
}else{
return 0;
}
}
3.進棧演算法
int push(SqStack &st,int x){
if(st.top==maxSize-1){//棧滿
return 0;
}
++(st.top);
st.data[st.top]=x;//先移動指標再進棧
return 1;
}
4.出棧演算法
int pop(SqStack &st,int &x){
if(st.top==-1){
return 0;
}
x=st.data[st.top];//取出元素再移動指標
--(st.top);
return 1;
}