您的位置:首页 > 其它

如何用一维数组实现两个栈的基本操作

2018-01-06 19:07 162 查看
数组在内存中是按顺序存放的,那么在实现栈的时候刚好就可以取最后一个元素即为栈顶,第一个栈实现还是很简单的,重点在于第二个栈如何在数组中存放,才会让操作变得简单。



由图可以看出  ,在第二个栈存放时,我们可以倒着存放,从数组最后一个序号开始,这样的话也能很容易的取到栈顶。

template <class T>
class TwoStackByArray
{
public:
TwoStackByArray() : _capacity(0), _arr(NULL), top1(0), top2(0)
{
CheckCapacity();
}
~TwoStackByArray()
{
if (_arr)
delete[] _arr;
}
void Push1(const T& x)
{
CheckCapacity();
_arr[top1++] = x;
}
void Push2(const T& x)
{
CheckCapacity();
_arr[top2--] = x;
}
void Pop1()
{
if (top1 != 0)
{
--top1;
}
}
void Pop2()
{
if (top2 < _capacity)
{
++top2;
}
}
size_t Size1()
{
return top1;
}
size_t Size2()
{
return _capacity-1 - top2;
}
bool Empty1()
{
return top1 == 0;
}
bool Empty2()
{
return top2 == _capacity - 1;
}
T& Top1()
{
if (top1>0)
return _arr[top1-1];

}
T& Top2()
{
if (top2<_capacity-1)
return _arr[top2+1];
}
void CheckCapacity()
{
if (_arr == NULL)
{
_capacity += 3;
_arr = new T[_capacity];
top2 = _capacity - 1;
return;
}
if (top1 == top2)
{
int oldCpacacity = _capacity;
_capacity *= 2;
T* tmp = new T[_capacity];
size_t i = 0;
for ( i = 0; i < top1; i++)
{
tmp[i] = _arr[i];
}
for (size_t j = oldCpacacity-1,i=_capacity-1; j > top2; j--,i--)
{
tmp[i] = _arr[j];
}
delete[] _arr;
_arr = tmp;
top2 += _capacity/2;
}
}
private:
T* _arr;
size_t top1;
size_t top2;
size_t _capacity;
};

void testTwoStackByArray()
{
TwoStackByArray<int> s;
s.Push1(1);
s.Push1(2);
s.Push1(3);
s.Push1(4);

s.Push2(6);
s.Push2(5);
s.Push2(3);
s.Push2(4);

cout << s.Size1() << endl;
cout << s.Size2() <<endl;

while (!s.Empty1())
{
cout << s.Top1() << " ";
s.Pop1();
}
cout << endl;
while (!s.Empty2())
{
cout << s.Top2() << " ";
s.Pop2();
}
cout << endl;
 }


到此,一个数组实现两个栈的程序就写完了,有问题请及时指出哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐