1.问题描述:
试在一个长度为n的数组中实现两个栈,使得二者在元素的总数目为n之前都不会溢出,并且保证push和pop操作的时间代价为O(1)。
2.完整代码如下:
/* 77.6 - C++ - 在一个长度为n的数组中实现两个栈、且共享存储区[0,max_size-1] */
/* 构栈方法 - 栈顶相向,迎面增长 */
#include <iostream>
using namespace std;
//混合顺序栈的类ArrStack
template <typename T>
class ArrStack
{
private:
int top1, top2, MaxSize; //top1 - 栈1的栈顶指针,top2 - 栈2的栈顶指针,MaxSize - 数组最大容量
T *st; //存放类型为T的栈元素数组
public:
ArrStack(int size); //构造函数 - 为栈预先分配空间,初始化栈顶指针
~ArrStack(); //析构函数
bool push(const int i, const T item); //入栈
bool pop(const int i, T &item); //出栈
};
//构造函数
template <typename T>
ArrStack<T>::ArrStack(int size)
{
MaxSize = size;
st = new T[MaxSize]; //给混合栈预先分配存储空间
top1 = -1; //初始化栈1指针
top2 = MaxSize; //初始化栈2指针
}
//析构函数
template <typename T>
ArrStack<T>::~ArrStack()
{
if( st != NULL )
{
delete [] st; //释放new分配的内存
cout << "析构函数调用成功" << endl;
}
}
//入栈
template <typename T>
bool ArrStack<T>::push(const int i, const T item)
{
if( top1+1 == top2 )
{
cout << "栈上溢出" << endl;
return false;
}
else
{
switch(i)
{
case 1:
st[++top1] = item; //入栈1,先是top1++,后将item赋值给st[top1]
break;
case 2:
st[++top2] = item; //入栈2
break;
}
}
return true;
}
//出栈
template <typename T>
bool ArrStack<T>::pop(const int i, T& item)
{
switch(i)
{
case 1:
if( top1 == -1 )
{
cout << "栈1下溢出" << endl;
return false;
}
else
item = st[top1--]; //先是item = st[top1], 再是top1--
break;
case 2:
if( top2 == MaxSize )
{
cout << "栈2上溢出" << endl;
return false;
}
else
item = st[top2--];
break;
}
return true;
}
int main()
{
int n, i;
char item;
cout << "请输入数组最大容量:";
cin >> n;
//以下为测试代码、读者可自行设计测试
ArrStack<char> A(n);
cout << "栈1入栈 - 'a'" << endl;
A.push(1,'a');
cout << "栈2入栈 - 'a'" << endl;
A.push(2,'a');
cout << "栈1入栈 - 'b'" << endl;
A.push(1,'b');
for( i = 0; i < 2; i++ )
{
cout << "请输入要入栈2元素:";
cin >> item;
A.push(2,item);
}
//输出栈2元素
for( i = 0; i < 3; i++ )
{
A.pop(2,item);
cout << "出栈2第" << i+1 << "个元素:" << item << endl;
}
cout << endl;
return 0;
}
3.运行结果:
![](https://img-blog.csdn.net/20180402103110386)