您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】栈面试题--一个数组实现两个栈

2016-10-03 20:17 246 查看
一个数组实现两个栈,有以下几种方法:

1.数组的奇数位置存储一个栈的元素,偶数位置存储另一个栈的元素;

2.两个栈分别从数组的中间向两头增长;

3.两个栈分别从数组的两头开始增长。



从图片中我们都可以看出,前边两种方法再一定的情况下会造成空间的浪费,所以我们

采用第三种方式完成。

下边给出代码实现:

#include<iostream>
using namespace std;
#include<stdlib.h>

template<typename T>
class StackArray
{
public:
StackArray()
:_array(new int [2])
, _size1(0)
, _size2(1)
, _capacity(2)
{}
~StackArray()
{
if (NULL != _array)
{
delete[] _array;
_array = NULL;
_size1 = 0;
_size2 = 0;
_capacity = 0;
}
}
void PushArr1(const T& x)
{
Capacity();
_array[_size1] = x;
_size1++;
}
void PushArr2(const T& x)
{
Capacity();
_array[_size2] = x;
_size2--;
}
void PopArray1()
{
if (_size1 > 0)
{
_size1--;
}
}
void PopArray2()
{
if (_size2 != _capacity-1)
{
_size2++;
}
}
T& TopArray1()
{
if (_size1 > 0)
{
return _array[_size1-1];
}
}
T& TopArray2()
{
if (_size2 > 0)
{
return _array[_size2+1];
}
}
void DisplayArray1()
{
if (_size1 > 0)
{
for (int i = _size1 - 1; i >= 0; --i)
{
cout << _array[i] << " ";
}
cout << endl;
}
}
void DisplayArray2()
{
if (_size2 > 0)
{
for (int i = _size2 + 1 ; i <_capacity; ++i)
{
cout << _array[i] << " ";
}
cout << endl;
}
}
private:
void Capacity()
{
if (_size1 + _size2 <= _capacity)
{
int NewCapacity = _capacity + 10;
T* tmp = new T[NewCapacity];
int k = NewCapacity - 1;
//memcpy(tmp, _array1, _size1*sizeof(T));
for (int i = 0; i < _size1; ++i)
{
tmp[i] = _array[i];
}
//memcpy(tmp+NewCapacity-1-_size2,_array2-_size2,_size2*sizeof(T));
for (int i = _capacity-1; i > _capacity-_size2; --i)
{
tmp[k] = _array[i];
k--;
}
delete[] _array;
_size2 = NewCapacity - (_capacity - _size2);

_capacity = NewCapacity;
_array = tmp;
}
}
private:
T* _array;
int _size1;
int _size2;
int _capacity;
};
//测试代码
void test()
{
StackArray<int> s;
s.PushArr1(1);
s.PushArr1(2);
s.PushArr1(3);
s.PushArr1(4);
s.PushArr1(5);
s.PushArr1(6);
s.PushArr1(7);
s.DisplayArray1();
s.PopArray1();
s.DisplayArray1();

s.PushArr2(5);
s.PushArr2(6);
s.PushArr2(7);
s.PushArr2(8);
s.PushArr2(9);
s.PushArr2(10);
s.DisplayArray2();
s.PopArray2();
s.DisplayArray2();
}
int main()
{
test();
system("pause");
return 0;
}

在实现过程中,需要注意几个问题:

1._size1和_size2分别指向栈顶元素的下一个位置。

2.内容复制过程中需要考虑对特殊类型比如string类型的特殊 处理。

3.仔细认真的保证各个判断条件准确无误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组