1. 程式人生 > >大白話講資料結構和演算法__11 棧的順序儲存結構定義與插入,刪除等操作

大白話講資料結構和演算法__11 棧的順序儲存結構定義與插入,刪除等操作

棧的定義

棧是一種重要的線性結構,可以這樣講,棧是線性表的一種具體形式。
例如,我們瀏覽網頁,點選後退,我們不會直接返回第一個介面,而是上一個頁面,這種後進先出的資料結構就是棧,棧應用是非常廣泛的。
例如我們Word,Photoshop等的“撤銷”功能也是如此。再例如我們C語言的函式,也是利用棧的基本原理實現的。
官方定義:

棧(Stack)是一個後進先出(Last in first out,LIFO)的線性表,它要求只在表尾進行刪除和插入操作。

說到底,所謂的棧,其實也就是一個特殊的線性表(順序表、連結串列),但是它在操作上有一些特殊的要求和限制:
棧的元素必須“後進先出”。
棧的操作只能在這個線性表的表尾進行。
注:對於棧來說,這個表尾稱為棧的棧頂(top),相應的表頭稱為棧底(bottom)。

因為棧的本質是一個線性表,線性表有兩種儲存形式,那麼棧也有分為棧的順序儲存結構和棧的鏈式儲存結構。
最開始棧中不含有任何資料,叫做空棧,此時棧頂就是棧底。

然後資料從棧頂進入,棧頂棧底分離,整個棧的當前容量變大。

資料出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。
 

我們可以看到棧的結構如下:

typedef struct{//定義一個棧
    int*base;//棧底
    int*top;//棧頂
    int stacksize;//棧的容量
}sqstack;

棧的初始化操作(建立一個棧)

void initstack(sqstack *s)//初始化一個空棧
{
    s->base = (int*)malloc(STACK_INIT_SIZE*sizeof(int));//棧底指向記憶體的開始
    if (!s->base)
        return;
    s->top = s->base;//棧頂和棧底相同時,棧的容量為0
    s->stacksize = STACK_INIT_SIZE;//棧的最大容量
}

棧的插入操作

棧的插入操作(Push),叫做進棧,也稱為壓棧,入棧。類似子彈放入彈夾的動作。

void push(sqstack*s, int item)//元素入棧
{
    if (s->top - s->base >= s->stacksize)//當棧滿時,重新擴充套件棧容量
    {
        s->base = (int*)realloc(s->base, (STACK_INIT_SIZE + STACKINCREMENT)*sizeof(int));
        if (!s->base)
            return;
        s->top = s->base + s->stacksize;//注意要對棧頂指標進行修改
        s->stacksize = STACK_INIT_SIZE + STACKINCREMENT;

    }
    *(s->top) = item;
    s->top++;
}

棧的刪除操作

棧的刪除操作(Pop),叫做出棧,也稱為彈棧。如同彈夾中的子彈出夾。

void pop(sqstack*s,int*e)//元素出棧
{
    if (s->top == s->base)//如果棧為空,返回
        return;
    s->top--;//棧頂指標減一,這裡一定是先將top指標減一然後再彈出
    *e = *(s->top);//將彈出的元素賦值給e指向的指標

}

棧的清空操作
 

void clearstack(sqstack*s)//清空一個棧
{
    s->top = s->base;
}

棧的銷燬操作

DestroyStack(sqStack *s){
    int i, len;
    len = s->stackSize;
    for( i=0; i < len; i++ ){
        free( s->base );
        s->base++;
        }
    s->base = s->top = NULL;
    s->stackSize = 0;
}

計算棧當前長度的操作

int StackLen(sqStack s)
{
return(s.top – s.base); 
}


有不理解的程式碼可以在下方留言,我會盡快回復