1. 程式人生 > >棧的基本操作(一)

棧的基本操作(一)

1.棧的基本概念

棧是一種只能在一端進行插入或刪除操作的線性表。其中允許進行插入或刪除操作的一端稱為(Top),棧頂由一個稱為棧頂指標的位置指示器(其實就是一個變數,對於順序棧,就是記錄棧頂元素在陣列位置標號的一個整型變數;對於鏈式棧,就是記錄棧頂元素所在結點地址的指標)來指示,它是動態變化的。表的另一端稱為棧底,棧底是固定不變的。棧的插入和操作一般稱為入棧和出棧。本篇文章以順序棧為主。

棧的特點

先進先出(FILO)。

棧的儲存結構

棧有兩種主要的儲存結構:順序棧和鏈式棧。棧是一種在操作上稍加限制的線性表,即其本質就是線性表,而線性表有兩種主要的儲存結構—順序表和鏈式表,因此棧有兩種儲存結構。

棧的數學性質

當n個編號元素以某種順序進棧,並且可以在任意時刻出棧,所獲得的編號元素排列的數目N恰好滿足Catalan函式的計算,即
這裡寫圖片描述

2.順序棧的基本操作

1.順序棧定義

typedef struct{
    int data[maxSize];//存放棧中元素
    int top;//棧頂指標
}SqStack;

如圖為順序棧的示意圖。
這裡寫圖片描述

對於順序棧,一共有4個要素,包括兩個特殊狀態和兩個操作。

  1. 兩個特殊狀態
    棧空狀態(st.top==-1)
    棧滿狀態(st.top==maxSize-1)

  2. 兩個操作
    元素進棧操作:++(st.top);st.data[st.top]=x;。 既然規定了top為1的時候棧空,則元素進棧操作必須是先移動指標,再進入元素

    ,因為陣列下標不存在-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;
}