用一个数组实现两个栈

来源:互联网 发布:网络导报张海亮 编辑:程序博客网 时间:2024/05/16 15:49


题目:一个数组实现两个栈


方案一:将数组的下标为0的位置当做第一个栈的栈底,下标为1的位置当做第二个栈的栈底,将数组的偶数位置看做第一个栈的存储空间,奇数位置看做第二个栈的存储空间。


方案二:从中间分别向两边压栈

将数组的中间位置看做两个栈的栈底,压栈时栈顶指针分别向两边移动,当任何一边到达数组的起始位置或是数组尾部,则开始扩容。


方案三:从两边向中间压栈

将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。


比较:方案二和方案一当两栈中元素不同时,比较浪费空间,方案三节省空间

这里只实现了方案三:


代码如下:

//一个数组实现两个栈template<class T>class TwoStack{public:TwoStack():_a(NULL), _top1(0), _top2(0), _capacity(0){_CheckCapacity();}~TwoStack(){if (_a)delete[] _a;}void Push1(const T& d){_CheckCapacity();_a[_top1++] = d;}void Push2(const T& d){_CheckCapacity();_a[_top2--] = d;}void Pop1(){if (_top1 > 0)--_top1;}void Pop2(){if (_top2 < _capacity-1)_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 _a[_top1-1];}}T& Top2(){if (_top2 < _capacity - 1)return _a[_top2+1];}private:void _CheckCapacity(){if (_a == NULL){_capacity += 3;_a = new T[_capacity];_top2 = _capacity - 1;return;}if (_top1 == _top2){size_t OldCapacity = _capacity;_capacity = _capacity * 2;T* tmp = new T[_capacity];for (size_t i = 0; i < _top1; i++){tmp[i] = _a[i];}for (size_t j = OldCapacity-1,i=_capacity-1; j>_top2;j--,i--){tmp[i] = _a[j];}delete[] _a;_a = tmp;_top2 += _capacity / 2;}}private:T* _a;size_t _top1;size_t _top2;size_t _capacity;};

测试代码:

void TestTwoStack(){TwoStack<int> s;s.Push1(1);s.Push1(2);s.Push1(3);s.Push1(4);s.Push1(5);s.Push2(1);s.Push2(2);s.Push2(3);s.Push2(4);s.Push2(5);cout << "s1:"<<s.Size1() << endl;;cout << "s2:" << s.Size2() << endl;while (!s.Empty1()){cout << s.Top1() << endl;s.Pop1();}while (!s.Empty2()){cout << s.Top2() << endl;s.Pop2();}}


栈和队列面试题完整代码网址:https://github.com/xyzbaihaiping/DataStructure


0 0