棧的應用非常廣泛,經常會出現一個程序中需要同時使用多個棧的情況。若使用順序棧,會因爲對棧空間大小難以準確估計,從而產生有的棧溢出、有的棧空間還很空閒的情況。爲了解決這個問題,可以讓多個棧共享一個足夠大的數組空間,通過利用棧的動態特性來使其存儲空間互相補充,這就是多棧的共享技術。
在順序棧的共享技術中,最常用的是兩個棧的共享技術,即雙端棧。它主要利用了棧的棧底位置不變,而棧頂位置動態變化的特性。
實現代碼如下:
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define M 100
//雙端順序棧的存儲結構
typedef struct
{
int Stack[M];//Stack[M]爲棧區
int top[2];//top[0]和top[1]分別爲兩個棧頂指示器
}DqStack;
//初始化雙端順序棧
void InitStack(DqStack *S)
{
S->top[0] = -1;
S->top[1] = M;
}
//雙端順序棧進棧操作
int Push(DqStack *S,int x,int i)//把數據元素x壓入i號堆棧
{
if (S->top[0]+1 == S->top[1])//棧已滿
{
return FALSE;
}
switch (i)
{
case 0: //0號棧
S->top[0]++;
S->Stack[S->top[0]] = x;
break;
case 1: //1號棧
S->top[1]--;
S->Stack[S->top[1]] = x;
break;
default: //參數錯誤
return FALSE;
break;
}
return TRUE;
}
//雙端順序棧出棧操作
int Pop(DqStack *S, int *x, int i)//從i號堆棧中彈出棧頂元素並送到x中
{
switch (i)
{
case 0: //0號棧出棧
if (S->top[0] ==-1)
{
return FALSE;
}
*x=S->Stack[S->top[0]] ;
S->top[0]--;
break;
case 1: //1號棧出棧
if (S->top[1] == M)
{
return FALSE;
}
*x = S->Stack[S->top[1]];
S->top[1]++;
break;
default:
return FALSE;
break;
}
return TRUE;
}