日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

棧的順序存儲及運(yùn)算

 WUCANADA 2012-02-20

棧的順序存儲及運(yùn)算

1.棧的順序存儲

  棧的順序存儲可用向量來實現(xiàn),即利用一組地址連續(xù)的存儲單元依次存放棧中的各個數(shù)據(jù)元素,又可稱為順序棧。最先 入棧的數(shù)據(jù)元素為棧底,最后入棧的數(shù)據(jù)元素為棧頂。一般將向量的低下標(biāo)位置作為棧底,并保持不變,棧頂位置隨著元素的進(jìn)棧和出棧操作而變化。為了方便操 作,通常設(shè)一個標(biāo)記top標(biāo)出棧頂元素所在的位置。使用C語言,我們可將順序棧的數(shù)據(jù)類型描述如下:

結(jié)構(gòu)3-1 順序棧

#define Maxsize 100     //假設(shè)棧空間最多為100個元素

typedef char Datatype;  //假設(shè)棧元素的數(shù)據(jù)類型為字符

typedef struct

{ Datatype data[Stacksize];

    int top;

  }Seqstack;

  該類型包含兩部分內(nèi)容:一是存放棧中數(shù)據(jù)元素的data數(shù)組,另一個是標(biāo)記棧頂位置的top。在C語言的描述 中,我們可約定data數(shù)組中的data[0]單元不用,并用top=0表示棧空,這也是初始化棧的狀態(tài)。在實際應(yīng)用時,需聲明一個屬于上述類型的棧變 量,即可對此變量進(jìn)行棧的有關(guān)操作。

  現(xiàn)假設(shè)有一個棧類型,其最大存儲空間Maxsize為6,s為指向該類型的棧指針,按照約定,棧中可存放的數(shù)據(jù) 元素最多為5個,可存放在s->data[1]至s->data[5]中。初始狀態(tài)下s->top=0,表示??眨鐖D3-2(a)所 示。當(dāng)棧不滿時,可進(jìn)行進(jìn)棧操作,當(dāng)棧不空時,可進(jìn)行出棧操作。若有數(shù)據(jù)元素(A,B,C,D,E)依次進(jìn)棧,則s->top每次加1,并將元素存 入s->top所標(biāo)記的位置,棧的狀態(tài)如圖3-2(b)、3-2(c)所示。若有數(shù)據(jù)元素出棧,則刪除s->top標(biāo)記位置的數(shù)據(jù)元 素,s->top每次減1,如圖3-2(d)所示。

32

(a)空棧            (b)A進(jìn)棧           (c)棧滿         (d)E、D出棧

圖3-2 順序棧的狀態(tài)及進(jìn)棧、出棧操作

  可見??蘸蜅M是進(jìn)行棧操作的兩個限制條件:

  ??諚l件:s->top = 0,此時不能進(jìn)行出棧操作

  棧滿條件:s->top = Maxsize -1,此時不能進(jìn)行進(jìn)棧操作

2.棧的基本運(yùn)算的實現(xiàn)

  算法3-1 初始化

  棧的初始化即創(chuàng)建一個空棧??赏ㄟ^指針變量獲取該空棧。算法描述如下: 

void init_seqstack(Seqstack *s)

 { s->top = 0;

 }

  算法3-2 判???/span>

  對一個已創(chuàng)建的棧判斷其是否為空。若為空,則返回1,否則,返回0,函數(shù)的返回值為整型,參數(shù)為指向已知棧的指針。算法描述如下:

int empty_seqstack (Seqstack *s)

 { if(s->top == 0)

     return 1;

   else 

return 0;

 }

  算法3-3 判棧滿

   對一個已創(chuàng)建的棧判斷其是否為滿。若為滿,則返回1,否則,返回0,函數(shù)的返回值為整型,參數(shù)為指向已知棧的指針。算法描述如下:

int full_seqstack (Seqstack *s)

 { if(s->top == Maxsize-1)

     return 1;

   else 

return 0;

 }

  算法3-4 進(jìn)棧

  將一個新的數(shù)據(jù)元素插入到棧中作為新的棧頂元素。注意插入前首先要判斷棧是否已滿,若棧滿,則不能插入,函數(shù)返回0值,表示插入不成功;若不滿,移動棧頂標(biāo)記,插入新的數(shù)據(jù)元素,函數(shù)返回1,表示插入成功。算法描述如下:

int push_seqstack(Seqstack *s, Datatype x)

 { if(full_seqstack(s))            //判棧是否為滿

   { printf(″Overflow\n″);

     return 0;}

  else

   { s->top++;

     (s->data)[s->top] = x;

     return 1;}

}

  算法3-5 出棧

  在已知棧中刪除棧頂元素并將棧頂元素作為返回值。注意在刪除操作之前首先要判斷棧是否為為空,若為空,則不能刪除;若不為空,則返回棧頂元素,移動棧頂標(biāo)記。算法描述如下:

Datatype pop_seqstack(Seqstack *s,Datatype *x)

 { if(empty_seqstack(s))         //判棧是否為空

     { printf(″Underflow\n″);     return 0;}

    else

     { &x = (s->data)[s->top];

s->top--;}

    return  x;

   }

  算法3-6 取棧頂元素

  在已知棧中取出棧頂元素并將棧頂元素作為返回值。注意在取出操作之前首先要判斷棧是否為為空,若為空,則無元素可??;若不為空,則返回棧頂元素。算法描述如下:

Datatype gettop_seqstack(Seqstack *s)

 { Datatype  x;

   if(empty_seqstack(s))        //判棧是否為空

     {printf(″Stack is empty.\n″);

      x = NULL;}

   else

      x = (s->data)[s->top];

   return x;

}

  算法3-7 置空

  將棧的棧頂標(biāo)記置為初始狀態(tài),成為空棧。算法描述如下: 

void clear_seqstack(Seqstack *s)

 { s->top = 0;

 }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多