一文搞懂共享棧


共享棧的概念

在這裏插入圖片描述
共享棧:兩個棧共享同一片存儲空間,這片存儲空間不單獨屬於任何一個棧,某個棧需要的多一點,它就可能得到更多的存儲空間;
兩個棧的棧底在這片存儲空間的兩端,當元素入棧時,兩個棧的棧頂指針相向而行。

忘記棧的概念的朋友可以回顧一下

是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入、刪除操作的一端稱爲棧頂。表的另一端稱爲棧底。棧頂的當前位置是動態的,對棧頂當前位置的標記稱爲棧頂指針。當棧中沒有數據元素時,稱之爲空棧。棧的插入操作通常稱爲進棧或入棧,棧的刪除操作通常稱爲退棧或出棧。

共享棧的實現

在這裏插入圖片描述

  • 這裏爲什麼用int top[2]={-1,maxsize};而不用int top1=-1,top2=maxSize;呢?

爲了體現這兩個棧底指針是屬於一個共享棧的,我們習慣於用一個長度爲2的數組表示它們,這樣顯得代碼的可讀性更強一點。

  • 什麼時候爲棧空狀態呢?

在這裏插入圖片描述

  • 共享棧怎麼入棧呢?

S1入棧:指針右移一個位置,即stack[++top[0]]=x;
S2入棧:指針左移一個位置,即stack[--top[0]]=x;

  • 什麼時候棧滿呢?
    兩個棧頂指針重合時,表示共享棧已經滿了
    在這裏插入圖片描述

用兩個棧模擬隊列

在這裏插入圖片描述
注意棧和隊列的本質區別:棧先進後出,隊列先進先出。因此務必要注意下圖的規則:
在這裏插入圖片描述
注意:如果要把棧S1的元素導入到棧S2,必須一次性全部導入,不然就會出錯。

基本操作我們分爲:初始化棧、入棧、出棧、取棧頂元素,具體實現代碼如下:(此處參考)

 #include<stdio.h>                                                           
 #define SharedStackMax 100
 typedef char SharedStackType;
 typedef struct SharedStack{
     SharedStackType data[SharedStackMax];
     size_t top1;
     size_t top2;
 }SharedStack;
 
 void SharedStackInit(SharedStack*stack)
 {
     if(stack==NULL)
     {
         return;
     }
     stack->top1=0;
     stack->top2=SharedStackMax;
 }
 void SharedStackPush1(SharedStack*stack,SharedStackType value)
 {
     if(stack==NULL)
     {
         return;
     }
     if(stack->top1==stack->top2)
     {
         return;
     }
     stack->data[stack->top1++]=value;
     return;
 }
 void SharedStackPush2(SharedStack*stack,SharedStackType value)
 {
     if(stack==NULL)
     {
         return;
     }
     if(stack->top2==stack->top1)
     {
         return;
     }                                                                       
     stack->data[--stack->top2]=value;
 }
 int  SharedStackTop1(SharedStack*stack,SharedStackType*value)
 {
     if(stack==NULL||value==NULL)
     {
         return 0;
     }
     if(stack->top1==0)
     {
         return 0;
     }
     *value=stack->data[top1-1];
     return 1;
 
 }
 int SharedStackTop2(SharedStack*stack,SharedStackType*value)
 {
     if(stack==NULL||value==NULL)
     {
         return 0;
     }
     if(stack->top2==SharedStackMax)                                         
     {
         return 0;
     }
     *value=stack->data[stack->top2];
     return 1;
}
 void SharedStackPop1(SharedStack*stack)
 {
     if(stack==NULL)
     {
         return;
     }
     if(stack->top1==0)
     {
         return;
     }
     stack->top1--;
 }
 void SharedStackPop2(SharedStack*stack)
 {
     if(stack==NULL)
     {
         return;                                                             
     }
     if(stack->top2==SharedStackMax)
     {
         return;
     }
     stack->top2++;
 }     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章