天天看點

棧的定義以及基本運算

棧和隊列實質上是倆種受限制的線性表

一 棧的定義:

 棧(stack)是限制僅在表的一端進行插入和删除運算的線性表。

(1)通常稱插入、删除的這一端為棧頂(top),另一端稱為棧底(bottom)。

(2)當表中沒有元素時稱為空棧。

(3)棧為後進先出(last in first out)的線性表,簡稱為lifo表。

棧的修改是按後進先出的原則進行。每次删除(退棧)的總是目前棧中"最新"的元素,即最後插入(進棧)的元素,而最先插入的是被放在棧的底部,要到最後才能删除。

棧的定義以及基本運算

二 棧的順序存儲結構

實質上是運算受限的線性表

(1)順序棧的類型定義

#define stacksize 100//假定預先配置設定100元素  

typedef char datatype;//假定棧元素的資料類型為字元  

typedef struct   

{  

    datatype data[stacksize];  

    int top;  

}seqstack;  

注:top用來訓示目前棧頂的位置,因為在棧低是不變的  

三 順序棧的基本操作  

規定: s是seqstack類型指針,s->data[0]為棧底元素  

(1)進棧操作  

進棧時,需要将s->top加1  

  ①s->top==stacksize-1表示棧滿  

  ②"上溢"現象--當棧滿時,再做進棧運算産生空間溢出的現象。  

(2)出棧操作  

 退棧時,需将s->top減1  

  ①s->top<0表示空棧  

  ②"下溢"現象——當棧空時,做退棧運算産生的溢出現象。  

 置棧空  

  void initstack(seqstack *s)  

    {//将順序棧置空  

        s->top=-1;  

    }   

判棧空  

  int stackempty(seqstack *s)  

    {  

        return s->top==-1;  

    }  

判棧滿  

  int stackfull(seqstack *s)  

     {  

       return s->top==stacksize-1;  

     }  

 進棧  

  void push(seqstack *s,int x)  

       if (stackfull(s))  

             printf("stack overflow"); //上溢,退出運作  

       s->data[++s->top]=x;//棧頂指針加1後将x入棧  

 退棧  

  datatype pop(seqstack *s)  

      if(stackempty(s))  

        {  

             printf("stack underflow"); //下溢,退出運作  

             exit(0);  

        }  

      return s->data[s->top--];//棧頂元素傳回後将棧頂指針減1  

取棧頂元素  

  datatype stacktop(seqstack *s)  

       if(stackempty(s))  

           {  

             printf("stack is empty");   

           }   

       return s->data[s->top];  

轉載:http://blog.csdn.net/xsf50717/article/details/39934051

繼續閱讀