两个栈共享空间
利用一个数组来存储两个栈;让一个栈底为数组的首端;一个栈底为数组的末端.每个栈都向数组中间延伸,以此来充分利用数组的空间。
只适用于两个相同的数据类型
#include<iostream>
using namespace std;
#define maxsize 10
template<class T>
class sqdoublestack {
public:
sqdoublestack();
~sqdoublestack();
void push(int stacknumberi, T x);
T pop(int stacknumber, T &e);
bool isempty(int stacknumber);
bool ispull();
void travelstack(int stacknumber);
void clear(int stacknumber);
private:
T data[maxsize];
int top1;
int top2;
};
template<class T>
sqdoublestack<T>::sqdoublestack()
{
this->top1 = -1;
this->top2 = maxsize;
}
template<class T>
sqdoublestack<T>::~sqdoublestack()
{
}
template<class T>
bool sqdoublestack<T>::isempty(int stacknumber)
{
if (stacknumber == 1)
{
if (this->top1 == -1) {
cout << "栈1为空!";
return 1;
}
else
return 0;
}
if (stacknumber == 2)
{
if (this->top2 == maxsize) {
cout << "栈2为空!";
return 1;
}
else
return 0;
}
}
template<class T>
bool sqdoublestack<T>::ispull()
{
return this->top1 + 1 == this->top2;
}
template<class T>
void sqdoublestack<T>::push(int stacknumber, T x)
{
if (!this->ispull())
{
if (stacknumber == 1) data[++top1] = x;
if (stacknumber == 2) data[--top2] = x;
}
}
template<class T>
T sqdoublestack<T>::pop(int stacknumber, T &e)
{
if (stacknumber == 1)
{
if (this->isempty(1))
return 0;
e = this->data[this->top1--];
}
else if (stacknumber == 2)
{
if (this->isempty(2))
return 0;
e = this->data[this->top2++];
}
return e;
}
template<class T>
void sqdoublestack<T>::travelstack(int stacknumber)
{
int p = this->top1;
int q = this->top2;
if (stacknumber == 1) {
while (p != -1)
cout << this->data[p--] << " ";
cout << endl;
}
if (stacknumber == 2) {
while (q != maxsize)
cout << this->data[q++] << " ";
cout << endl;
}
}
template<class T>
void sqdoublestack<T>::clear(int stacknumber)
{
if (stacknumber == 1)
this->top1 = -1;
if (stacknumber == 2)
this->top2 = maxsize;
}
int main()
{
sqdoublestack <int> s;
int e;
for (int i = 0; i <10; i++)
{
s.push(2, i);
}
cout << s.isempty(2) << endl;
cout << s.ispull() << endl;
cout << s.pop(2, e) << endl;
cout << s.pop(2, e) << endl;
s.travelstack(2);
system("pause");
return 0;
}