一个数组实现两个栈
2016-06-11 18:52
106 查看
【面试题】一个数组实现两个栈
思路一:在数组中,一个栈从左往右增长,另一个栈从右往左增长。
思路二:采用交叉索引法,1号栈所占数组索引1,3,5,7.....;2号栈所占数组索引2,4,6,8.......
思路一必须给定数组长度,不易动态增长,但可通过扩容实现动态增长。
思路二比思路一容易动态增长,但空间利用率低,对两个栈实现了公平。
思路一的实现如下:
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1762157
思路一:在数组中,一个栈从左往右增长,另一个栈从右往左增长。
思路二:采用交叉索引法,1号栈所占数组索引1,3,5,7.....;2号栈所占数组索引2,4,6,8.......
思路一必须给定数组长度,不易动态增长,但可通过扩容实现动态增长。
思路二比思路一容易动态增长,但空间利用率低,对两个栈实现了公平。
思路一的实现如下:
) , _size(size) , _capacity(size) {} ~TwoStack() { if (_arr) { delete[] _arr; } } public: //indx判断需要进行插入、删除等操作的栈是哪个栈,设置indx为0时是_stack1,为1时是_stack2 void CheckCapacity(); void Push(size_t indx, const T& x); void Pop(size_t indx); bool Empty(size_t indx); size_t Size(size_t indx); T& Top(size_t indx); void PrintArr(); private: size_t _stacktop1;//栈1栈顶位置 size_t _stacktop2;//栈2栈顶位置 T* _arr; size_t _size; size_t _capacity; }; template<class T> void TwoStack<T>::CheckCapacity() { if (_stacktop1 - 1 == _stacktop2)//当发生交叉时,则数组已满 { _capacity = 2 * _capacity + 3; T* tmp = new T[_capacity]; for (size_t i = 0; i < _stacktop1; i++) { tmp[i] = _arr[i]; } for (size_t i = 1; i < _size - _stacktop2; i++)//_size - _stacktop2 - 1为栈2的大小 { tmp[_capacity - i] = _arr[_size - i]; } delete[] _arr; _arr = tmp; _size = _capacity;//更新数组大小 _stacktop2 = _size - _stacktop2 - 1;//更新栈2的栈顶位置,指向下一个栈存放的下标 } } template<class T> void TwoStack<T>::Push(size_t indx, const T& x) { CheckCapacity(); if (indx == 0) { _arr[_stacktop1] = x; _stacktop1++; } if (indx == 1) { _arr[_stacktop2] = x; _stacktop2--; } } template<class T> void TwoStack<T>::Pop(size_t indx) {//注意在入栈后_stacktop1和_stacktop2指向即将下一个进栈的位置 assert(_size); if (indx == 0) { if (_stacktop1 == 0) { cout << ]思路二的实现如下:在面试时,由于时间紧迫,我们可以不用实现动态的,只需实现静态的数组,并实现push()和pop().template<class T> class TwoStack { public: TwoStack() :_stacktop1(-1) , _stacktop2(-2) , _array(new T[MAX_SIZE]) {} ~TwoStack() { if (_array) { delete[] _array; } } public: //indx判断需要进行插入、删除等操作的栈是哪个栈,设置indx为1时是_stack1,为0时是_stack2 void Push(size_t indx, const T& x); void Pop(size_t indx); bool Empty(size_t indx); size_t Size(size_t indx); T& Top(size_t indx); void PrintArr(); private: int _stacktop1;//栈1栈顶位置 int _stacktop2;//栈2栈顶位置 T* _array; }; template<class T> void TwoStack<T>::Push(size_t indx, const T& x) { if (indx == 1) { if (_stacktop1 + 2 >= MAX_SIZE) { cout << "Stack1 is full!" << endl; } else { _stacktop1 += 2; _array[_stacktop1] = x; } } if (indx == 0) { if (_stacktop2 + 2 >= MAX_SIZE) { cout << "Stack2 is full!" << endl; } else { _stacktop2 += 2; _array[_stacktop2] = x; } } } template<class T> void TwoStack<T>::Pop(size_t indx) { if (indx == 1) { if (_stacktop1 < 0) { cout << "Stack1 is empty!" << endl; } else { _stacktop1 -= 2; } } if (indx == 0) { if (_stacktop1 < 1) { cout << "Stack2 is empty!" << endl; } else { _stacktop2 -= 2; } } } template<class T> bool TwoStack<T>::Empty(size_t indx) { if (indx == 1) { return _stacktop1 == 0; } if (indx == 0) { return _stacktop2 == 1; } } template<class T> size_t TwoStack<T>::Size(size_t indx) { if (indx == 1) { return (_stacktop1 + 1) / 2; } if (indx == 0) { return (_stacktop2 + 2) / 2;//由于_stacktop2为奇数,且/运算,故+2 } } template<class T> T& TwoStack<T>::Top(size_t indx) { if (indx == 1) { return _array[_stacktop1]; } if (indx == 0) { return _array[_stacktop2]; } } template<class T> void TwoStack<T>::PrintArr() { if (Empty(0)) { cout << "Stack1 is empty!" << endl; } else if(Empty(0)) { cout << "Stack2 is empty!" << endl; } else { cout << "Stack1:"; for (int i = 1; i <= _stacktop1; i += 2) { cout << _array[i]<<" "; } cout << '\n' << "Stack2:"; for (int i = 0; i <= _stacktop2; i += 2) { cout << _array[i]<<" "; } cout << endl; } }测试用例如下:
void Test()
{
TwoStack<string> s1;
s1.Push(1, "aaaaa");
s1.Push(1, "bbbbb");
s1.Push(1, "lllll");
s1.Push(0, "yyyyy");
s1.Push(0, "fffff");
s1.Push(0, "ggggg");
s1.PrintArr();
s1.Pop(1);
s1.PrintArr();
s1.Pop(0);
s1.PrintArr();
cout << "empty: "<<s1.Empty(1) << "----" << s1.Empty(0) << endl;
cout << "size: " << s1.Size(1) << "----" << s1.Size(0) << endl;
cout << "top: " << s1.Top(1) << "----" << s1.Top(0) << endl;
s1.Pop(1);
s1.Pop(1);
s1.Pop(1);
s1.PrintArr();
}
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1762157
相关文章推荐
- 迷宫问题
- mongodb的基本操作与插入文档(document)
- 360
- 经典问题之最大子矩阵
- 判断一个字符串是否为另外一个字符串旋转之后的字符串
- 字符串和对应的整数之间的转换
- 编写一个函数itob(),将整数n转换为以b进制的数,保存到s中
- 二维数组中的查找—杨氏矩阵
- 编写一个函数将参数字符串中的字符反向排列
- 在终端输入多行信息,找出包含“ould”的行,并打印改行
- 编写冒泡排序,排序一个整形数组
- 模拟实现printf
- 调整数组使奇数全部都位于偶数前面
- 找出数组中两个只出现了一次的数
- 实现常用字符串处理函数(不调用库函数)
- strlen函数的多种实现方式
- 编写冒泡排序,可以排序整形数组,也可以排序字符串
- 实现一个简易通讯录
- 注释转换
- 排序算法比较