資料結構(C實現)------- 順序棧

來源:互聯網
上載者:User

標籤:順序棧的實現

         棧是限定僅在表的一端進行插入或刪除的純屬表,通常稱允許插入,刪除的一端為棧頂(Top),相應在的,則稱另一端為棧底(Bottom)。不含元素的棧則稱為空白棧。

         所設棧S={a1,a2,a3,...,an},則稱a1為棧底元素,an為棧頂元素。根據棧的定義可知,棧頂元素總是最後入棧並且最先出棧的;棧底元素總是最先入棧並且最後出棧的。即棧是按後進先出的原則進行的。因此,棧又稱為後進先出(LIFO)的線性表。

         而順序棧,即棧的順序儲存結構。它是利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,同時附設指標top指示棧頂元素在順序表中的位置。類似於順序表,用一維資料描述順序中的資料元素的儲存地區,而棧頂的位置則是隨著插入和刪除而變化的,通常將用一個整數表示,將數組下標為0的一端設定為棧底。

       

        順序棧的類型描述:

#define MAXSIZE 100 //棧的最大空間//順序棧類型描述typedef int ElemType;typedef struct{ElemType data[MAXSIZE];int top;}SqStack;

        在順序棧中,若將數組下標為0的一端設為棧底,則當top的值為-1時,則表示棧空,每次向棧中壓入一個元素時,首先便top的值加1,然後再把資料元素在於該位置。每次從棧中彈出一個元素時,首先取出棧頂元素,然後使top的值減1,指示新的棧頂元素。

 

         順序棧的基本操作:

            1. 初始化棧Init_SqStack(SqStack* S)

            順序棧的初始化是要構造一個空的順序棧。只需要將空順序棧S中的top置為-1,表示棧中目前並沒有資料元素,演算法的複雜度為O(1)。

//初始化棧void Init_SqStack(SqStack* S){S->top = -1;}
          

            2.  判斷棧空isEmpty_SqStack(SqStack* S)

            因為棧底設定在數組的0下標處,即S->data[0]表示棧底元素,所以空棧時棧頂指標top=-1。若top=-1,則表示棧空,返回1,否則,則表示棧非空,返回0,演算法的複雜度為O(1)。 

//判斷棧空int isEmpty_SqStack(SqStack* S){if(S->top  == -1)return 1;elsereturn 0;}

         

           3.  判斷棧滿isFull_SqStack(SqStack* S)

           因為設定了棧的最大空間,所以在入棧時必須先判斷棧是否已滿,即當top= MAXSIZE時,則表示棧滿,返回1,否則,則表示棧非空,返回0,演算法的複雜度為O(1)。

//判斷棧滿int isFull_SqStack(SqStack* S){if(S->top  ==  MAXSIZE)return 1;elsereturn 0;}
           

          4. 入棧 Push_SqStack(SqStack* S,ElemType x)

          首先,檢測棧是否已滿,若是,則輸出提示資訊,結束,否則,指標top值加1,將元素x存於棧頂位置即可,演算法的複雜度為O(1)。

//入棧操作void Push_SqStack(SqStack* S,ElemType x){//棧滿,則退出if(isFull_SqStack(S)){printf("棧滿!\n");exit(0);}else{S->data[++(S->top)] = x;}}

       

          5. 出棧Pop_SqStack(SqStack* S,ElemType* x)

          首先,檢測棧是否為空白,若是,則輸出提示資訊,結束,否則,將棧頂元素賦值給x,並將指標top減1,,演算法的複雜度為O(1)。

//出棧void Pop_SqStack(SqStack* S,ElemType* x){//如果棧空,則輸出提示資訊,並退出if(isEmpty_SqStack(S)){printf("棧空!\n");exit(0);}else*x =  S->data[S->top--];}

       

         6. 讀取棧頂元素Top_SqStack(SqStack* S,ElemType* x)

         讀頂元素與出棧運算都是取得棧頂元素的值,二者的區別在於:讀棧頂元素時,棧頂指標不發生變化,僅讀取棧頂元素,而出棧還要將棧頂元素刪除,此時,棧頂指標也要發生變化,時間複雜度為O(1)

//讀取棧頂元素void Top_SqStack(SqStack* S,ElemType* x){if(isEmpty_SqStack(S)){printf("棧空!\n");exit(0);}else *x = S->data[S->top];}

         

          7. 輸出整個棧Print_SqStack(SqStack* S)

          輸出棧,只需要從棧頂開始讀取到棧底,將棧中所有的資料元素輸出即可。

//輸出整個棧void Print_SqStack(SqStack* S){if(isEmpty_SqStack(S)){printf("棧空!\n");exit(0);}int length = S->top;while(length > -1)printf("%d\t",S->data[length--]);printf("\n");}
           


 

           

資料結構(C實現)------- 順序棧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.