共享棧的概念
共享棧:兩個棧共享同一片存儲空間,這片存儲空間不單獨屬於任何一個棧,某個棧需要的多一點,它就可能得到更多的存儲空間;
兩個棧的棧底在這片存儲空間的兩端,當元素入棧時,兩個棧的棧頂指針相向而行。
忘記棧的概念的朋友可以回顧一下:
棧是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入、刪除操作的一端稱爲棧頂。表的另一端稱爲棧底。棧頂的當前位置是動態的,對棧頂當前位置的標記稱爲棧頂指針。當棧中沒有數據元素時,稱之爲空棧。棧的插入操作通常稱爲進棧或入棧,棧的刪除操作通常稱爲退棧或出棧。
共享棧的實現
- 這裏爲什麼用
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++;
}