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

一个数组实现两个栈,有以下几种方法:

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.仔细认真的保证各个判断条件准确无误。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值