數據結構--棧(C語言實現)


一、棧的基本概念

1.棧的定義

棧是一種只能在一端進行插入或刪除的線性表。其中允許進行插入或刪除操作的一端稱為棧頂(top)。棧的插入和刪除操作一般稱作入棧和出棧。

2.棧的特點

先進后出

3.棧的存儲結構

順序棧和鏈式棧

注意:鏈式棧通常采用單鏈表實現,並規定所有的操作都是在單鏈表的表頭進行的。而且對於帶頭結點和不帶頭結點的鏈棧,具體的實現會有所不同。

4.棧的數學性質

當n個元素以某種順序進棧,並且可在任意時刻出棧(滿足先進后出的前提),所獲得的元素排列的數目N恰好滿足:

\[N=\frac{1}{n+1} \times C_{2n}^n \]

二、結構體的定義

1.順序棧

typedef struct
{
    int data[maxSize];	//存放棧中元素,maxSize是已經定義的常量
    int top;	//棧頂指針
}SqStack;

2.鏈棧結點定義

typedef struct LNode
{
    int data;	//數據域
    struct LNode *next;	//指針域
}LNode;

三、順序棧

1.順序棧的要素

(1)幾個狀態

1)棧空狀態

st.top == -1。(可能會出現st.top == 0的情況,具體問題具體分析)

2)棧滿狀態

st.top == maxSize-1。

3)非法狀態

上溢或下溢

(2)兩個操作

1)元素進棧。

++(st.top);

st.data[st.top]=x;

2)元素出棧

x=st.data[s.top];

--s.top;

2.初始化棧

void initStack(SqStack &st)
{
    st.top=-1;	//只需將棧頂指針設為-1
}

3.判空

int isEmpty(SqStack st)
{
    if(st.top==-1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

4.進棧

int Push(SqStack &st,int x)
{
    if(st.top==maxSize-1)	//判斷是否棧滿
    {
        return 0;
    }
    ++(st.top);	//	先移動指針,再進棧
    st.data[st.top]=x;
    return 1;
}

5.出棧

int Pop(SqStack &st,int &x)
{
    if(st.top==-1)	//判斷是否為空
    {
        return 0;
    }
    x=st.data[s.top];	//先取出元素,再進棧
    --st.top;
}

四、鏈棧

1.鏈棧的要素

(1)兩個狀態

1)棧空狀態

lst->next==NULL

2)棧滿狀態

不存在

(2)兩個操作

1)進棧(帶頭結點)

p->next=lst->next; lst->next=p;//其實就是頭插法建立單鏈表中的插入操作

2)出棧

p=lst->next;x=p->data;lst->next=p->next;free(p);//其實就是帶頭結點的單鏈表的刪除操作

2.初始化

void initStack(LNode *&lst)	//lst要改變,采用引用型,&
{
    lst=(LNode*)malloc(sizeof(LNode));//制造一個頭結點
    lst->next=NULL;
}

3.判空

int isEmpty(LNode *lst)
{
    if(lst->next==NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

4.進棧

void Push(LNode*lst,int x)
{
    LNode *p;
    p=(LNode*)malloc(sizeof(LNode));
    p->next=NULL;//每當申請新結點的時候,將指針域設置為NULL,可以避免一些錯誤
    /*以下就是鏈表的頭插法*/
    p->data=x;
    p->next=lst->next;
    lst->next=p;
}

5.出棧

int Pop(LNode*&lst,int &x)
{
    LNode *p;
    if(lst->next==NULL)
    {
        return 0;
    }
    /*以下就是單鏈表的刪除操作*/
    p=lst->next;
    x=p->data;
    lst->next=p->next;
    free(p);
    return 1;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM