(2) 设计两个栈 S1、S2 都采用顺序栈方式,并且共享一个存储区[0,MaxLen-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式,设计一个有关栈的入栈和出栈算法。
代码:
#include <iostream> using namespace std; const int StackSize =15; template <class T> class BothStack { public: BothStack() { lsTop=-1; rsTop=StackSize; } ~BothStack() { } void Push(int i,T x); T Pop(int i,T *x); private: T data[StackSize]; int lsTop,rsTop; }; template<class T> void BothStack<T>::Push(int i,T x) { if(rsTop==lsTop+1) { throw i; } if(i==1) { lsTop++; data[lsTop]=x; } else if(i==2) { rsTop--; data[rsTop]=x; } else cout<<"该桟不存在!"<<endl; return; } template<class T> T BothStack<T>::Pop(int i,T *x) { if(i==1) { if(lsTop==-1) { return 0; } *x=data[lsTop]; lsTop--; } else if(i==2) { if(rsTop==StackSize) { return 0; } *x=data[rsTop]; rsTop++; } else { cout<<"该桟不存在!"<<endl; return 0; } return 1; } int main() { int x,j,i=0; int A[10]={1,3,5,7,9,11,13,15,17,19}; int B[10]={2,4,6,8,10,12,14,16,18,20}; BothStack<int> S; try { for(i=0;i<sizeof(A)/sizeof(int);i++) S.Push(1,A[i]); for(i=0;i<sizeof(B)/sizeof(int);i++) S.Push(2,B[i]); }catch(int j){ cout<<"栈已满!"<<endl; cout<<"桟1:"; while(true) { if(S.Pop(1,&x)) cout<<x<<" "; else { cout<<"桟1已空!"<<endl; break; } } cout<<"桟2:"; while(true) { if(S.Pop(2,&x)) cout<<x<<" "; else { cout<<"桟2已空!"<<endl; break; } } } while(S.Pop(1,&x)) { cout<<"桟1:"; cout<<x<<" "; while(S.Pop(1,&x)) { cout<<x<<" "; } } cout<<endl; while(S.Pop(2,&x)) { cout<<"桟2:"; cout<<x<<" "; while(S.Pop(2,&x)) { cout<<x<<" "; } } return 0; }