某程序需要两个栈s1、s2,但任何时候s1、s2存储的元素总数不超过2MAX,但某些时候s1或s2储存的元素个数会超过MAX。
对于双栈,可以采用同一个内存空间,通过首指针和尾指针分别作为两个栈的顶指针,从而实现双栈。
双栈最大的好处是内存利用率高,灵活性强。
但也有运算复杂、长度固定等缺点。
#include<iostream>
using namespace std;
template <class T>
class DualStack
{
private:
int top1,top2;
T * data;
int allMaxsize;
public:
DualStack(int sz);
~DualStack(){
delete []data;
};
bool full();
bool empty1();
bool empty2();
int size1();
int size2();
int push1(T x);
int push2(T x);
T pop1();
T pop2();
} ;
template<class T>
DualStack<T>::DualStack(int sz)
{
allMaxsize=2*sz;
data=new T[allMaxsize];
top1=-1;
top2=allMaxsize;
}
template<class T>
bool DualStack<T>::full()
{
return top1+1==top2;
}
template<class T>
bool DualStack<T>::empty1()
{
return top1==-1;
}
template<class T>
bool DualStack<T>::empty2()
{
return top2==allMaxsize;
}
template<class T>
int DualStack<T>::size1()
{
return top1+1;
}
template<class T>
int DualStack<T>::size2()
{
return allMaxsize-top2;
}
template<class T>
int DualStack<T>::push1(T x)
{
if(full())return 0;
data[++top1]=x;
return 1;
}
template<class T>
int DualStack<T>::push2(T x)
{
if(full())return 0;
data[--top2]=x;
return 1;
}
template<class T>
T DualStack<T>::pop1()
{
return data[top1--];
}
template<class T>
T DualStack<T>::pop2()
{
return data[top2++];
}
int main()
{
DualStack<int> a(30);
for(int i=1;i<15;i++){
a.push1(i);
a.push2(i);
}
for(int i=1;i<15;i++){
cout<<a.pop1()<<' '<<a.pop2()<<endl;
}
}