如何用一维数组实现两个栈的基本操作
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;
到此,一个数组实现两个栈的程序就写完了,有问题请及时指出哦~
由图可以看出 ,在第二个栈存放时,我们可以倒着存放,从数组最后一个序号开始,这样的话也能很容易的取到栈顶。
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;}
到此,一个数组实现两个栈的程序就写完了,有问题请及时指出哦~
相关文章推荐
- 熟悉Access2013的基本操作(*如何设置两个主键)
- 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制
- 如何用两个栈来实现一个队列,并分析有关队列操作的运行时间。
- HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作
- 数据结构 编写一个类,用两个栈实现队列,支持队列的基本操作(add 、poll、peek)
- 如何用两个队列实现一个栈,并分析有关栈操作的运行时间。
- 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制之 第二部分
- 仅使用基本的表操作实现两个排序后的表L1和L2的并集
- 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
- HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作
- HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作
- javascript操作两个选择列表(有两个列表,如何实现在一个列表通过双击和多选列表中内容添加到另一个列表. )
- awk 如何处理两个文件,实现类似数据库表连接的操作
- 10.1-2 说明如何用一个数组A[1..n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢,注意PUSH和POP操作的时间应为O(1)。
- awk 如何处理两个文件,实现类似数据库表连接的操作
- C#如何实现对XML文件的基本操作
- 225. Implement Stack using Queues 用两个队列实现栈的基本操作。
- 如何用两个队列实现一个栈,并分析有关栈操作的运行时间。
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 利用两个栈实现队列的--->基本操作